在做android随手势放大bitmap是出现oom异常。请问大家如何快速放大bitmap而又能避免oom异常喔、 谢谢啦

解决方案 »

  1.   

    1.用recycle回收掉不用的bitmap
    2.通过jni,native code 增加限制的process内存大小(只是听说过,我并没有实践过)
    3.在layout固定大小的前提下,写个class extends View的物件,然后复写onDraw(Canvas canvas),在此方法内作矩阵的变换绘出图形内容,并不需要一直去create bitmap,减少内存消耗。
      

  2.   

    reclyle()方法 好像是这么写的吧 
      

  3.   


    我想实现的效果就是 想pdf阅读器那样的效果:手势能快速的放大、缩小图片,手指松开后,才重新加载图片不知道这个效果是如何实现的、  求解 谢谢啊
      

  4.   

    可以使用Matrix这个对象进行操作,放大,缩小,效果很好,也没出现过异常啊
      

  5.   

    gesture 类吧
    这样会方便点
    稍晚贴源码
      

  6.   

    1.用matrix进行图片的放大。
    2.多点触屏的处理。
    3.注意Bitmap的回收。也期待源码的出现。
      

  7.   

    android现在只支持两点触摸,所以只能根据两点触摸位置缩放
      

  8.   

    先将bitmap转换为drawable吧,再放大drawable,用drawable的setBounds方法可以控制drawable的大小,这样放大后也不会增加内存。
      

  9.   

    可以自己实现多点触摸 
    改framework下面的 inputmanager 里面对触点的index只封装了0 1 两个
    你再把2 3 什么封装然后上报就好了 
      

  10.   

    多点触屏嘛,做过一点简单的  你看看吧  功能什么的还凑合public boolean onTouchEvent(MotionEvent event) { getImageRange(image);
    int action = event.getAction() & MotionEvent.ACTION_MASK;
    switch (action) {
    case MotionEvent.ACTION_DOWN:
    System.out.println("ACTION_DOWN");
    matrix.set(image.getImageMatrix());
    savedMatrix.set(matrix);
    start.set(event.getX(), event.getY());
    mode = DRAG;
    break;
    case MotionEvent.ACTION_POINTER_DOWN:
    System.out.println("ACTION_POINTER_DOWN");
    oldDist = spacing(event);
    if (oldDist > 10f) {
    savedMatrix.set(matrix);
    setMidPoint(mid, image);
    mode = ZOOM;
    }
    break;
    case MotionEvent.ACTION_UP:
    System.out.println("ACTION_UP");
    break;
    case MotionEvent.ACTION_POINTER_UP:
    System.out.println("ACTION_POINTER_UP");
    mode = NONE; break; case MotionEvent.ACTION_MOVE:
    // System.out.println("ACTION_MOVE"); if (mode == DRAG) {
    float X = event.getX();
    float Y = event.getY();
    if (X >= leftX + zoomInGesture && X <= rightX + zoomInGesture
    && Y >= topY + zoomInGesture
    && Y <= bottomY + zoomInGesture) {
    System.out.println("DRAG");
    matrix.set(savedMatrix); matrix.postTranslate(event.getX() - start.x, event.getY()
    - start.y);
    } } else if (mode == ZOOM) { float newDist = spacing(event);
    if (newDist > 10f) {
    float X1 = event.getX(0);
    float Y1 = event.getY(0);
    float X2 = event.getX(1);
    float Y2 = event.getY(1);
    if (X1 >= leftX + zoomInGesture
    && X1 <= rightX + zoomInGesture
    && Y1 >= topY + zoomInGesture
    && Y1 <= bottomY + zoomInGesture
    && X2 >= leftX + zoomInGesture
    && X2 <= rightX + zoomInGesture
    && Y2 >= topY + zoomInGesture
    && Y2 <= bottomY + zoomInGesture) {
    System.out.println("ZOOM");
    matrix.set(savedMatrix);
    float scale = newDist / oldDist;
    matrix.postScale(scale, scale, mid.x, mid.y);
    }
    }
    }
    break; }
    image.setImageMatrix(matrix);
    return true;
    } private float spacing(MotionEvent event) {
    float x = event.getX(0) - event.getX(1);
    float y = event.getY(0) - event.getY(1);
    return FloatMath.sqrt(x * x + y * y);
    } // private void setMidPoint(PointF point, MotionEvent event) {
    // float x = event.getX(0) + event.getX(1);
    // float y = event.getY(0) + event.getY(1);
    // point.set(x / 2, y / 2);
    // }
    private void setMidPoint(PointF point, ImageView view) {
    int left = view.getLeft();
    int top = view.getTop();
    float x = left + left + view.getWidth();
    float y = top + top + view.getHeight();

    point.set(x / 2, y / 2);
    } private void getImageRange(ImageView view) {
    leftX = view.getLeft();
    rightX = view.getRight();
    topY = view.getTop();
    bottomY = view.getBottom();

    }