在做android随手势放大bitmap是出现oom异常。请问大家如何快速放大bitmap而又能避免oom异常喔、 谢谢啦
解决方案 »
- 进来谈谈android内存溢出问题吧
- 如何学习JIN
- 求教一道关于android生命周期的题
- 怎样让EditText获得焦点?
- 关于canvas.drawtext()
- android 关于通过NDK调用 c库渲染图片!急!!!!!
- Android 中文论坛
- 怎样在abd shell 启动时执行某脚本?
- 联系人存储位置在android源码哪个地方写的
- Android中如何安排若干个线程的执行顺序呢
- android light sensor和temperature sensor得到的数据怎样传递到画布上(2个矩形框显示)
- 更新了eclipse的android插件,在运行以前工程的时候报错,大家帮我看看是怎么回事?
2.通过jni,native code 增加限制的process内存大小(只是听说过,我并没有实践过)
3.在layout固定大小的前提下,写个class extends View的物件,然后复写onDraw(Canvas canvas),在此方法内作矩阵的变换绘出图形内容,并不需要一直去create bitmap,减少内存消耗。
我想实现的效果就是 想pdf阅读器那样的效果:手势能快速的放大、缩小图片,手指松开后,才重新加载图片不知道这个效果是如何实现的、 求解 谢谢啊
这样会方便点
稍晚贴源码
2.多点触屏的处理。
3.注意Bitmap的回收。也期待源码的出现。
改framework下面的 inputmanager 里面对触点的index只封装了0 1 两个
你再把2 3 什么封装然后上报就好了
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();
}