请问如何让bitmap无限制放大,不用imageview。普通的matrix放大会超出内存。
------解决方案--------------------
可以以一个点为中心。。当图片放大到超出屏幕以后截取屏幕中显示的部分。。循环。
这样可以解决内存溢出问题
------解决方案--------------------
------解决方案--------------------
这个组件我写过,给你放一个源码希望对你有用,放大那还有一点没有作,就是得到左上角的x,y。
- Java code
import android.content.Context;import android.graphics.Matrix;import android.graphics.PointF;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.AttributeSet;import android.util.FloatMath;import android.view.GestureDetector;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.ImageView;public class DragImageView extends ImageView implements OnTouchListener { // To get an GestureDetector will be used to get DoubleClickEvent GestureDetector gd; // These matrices will be used to move and zoom image Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); // We can be in one of these 3 states static final int NONE = 0; static final int DRAG = 1; static final int ZOOM = 2; int mode = NONE; // Dragable && Moveable boolean Moveable = false; boolean Dragable = false; boolean Zoomable = false; // Remember some things for zooming PointF start = new PointF(); PointF end = new PointF(); PointF mid = new PointF(); float oldDist = 1f; // size of drawable float drawable_width; float drawable_height; // the point in the left and top on the screen float x_point = 0.0f; float y_point = 0.0f; // the changed size of x and y float x_change = 0.0f; float y_change = 0.0f; // the size of imageview float imageview_width; float imageview_height; public DragImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public DragImageView(Context context, AttributeSet attrs) { super(context, attrs); this.setOnTouchListener(this); gd = new GestureDetector(new mGesture()); setScaleType(ScaleType.MATRIX); drawable_height = this.getDrawable().getIntrinsicHeight(); drawable_width = this.getDrawable().getIntrinsicWidth();// Log.i("", "drawable_width=" + drawable_width);// Log.i("", "drawable_height=" + drawable_height); } public DragImageView(Context context) { super(context); } @Override public boolean onTouch(View v, MotionEvent event) { // To deal GestureEvent gd.onTouchEvent(event); imageview_width = v.getWidth(); imageview_height = v.getHeight(); // Handle touch events here... switch (event.getAction() & MotionEvent.ACTION_MASK)/* 如果想监听多触点事件必须与Action_MASK相与 */{ case MotionEvent.ACTION_DOWN: start.set(event.getX(), event.getY()); matrix.set(this.getImageMatrix()); savedMatrix.set(matrix); mode = DRAG; break; case MotionEvent.ACTION_POINTER_DOWN: oldDist = spacing(event); if (oldDist > 10f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; } break; case MotionEvent.ACTION_UP: if (Dragable) {/* 用来区分是单击还是拖动 */ x_point += (end.x - start.x); y_point += (end.y - start.y); Dragable = false; decideAnimation(x_point, y_point); } mode = NONE; break; case MotionEvent.ACTION_POINTER_UP: mode = NONE; decideAnimation(x_point, y_point); break; case MotionEvent.ACTION_MOVE: if (Moveable) { if (mode == DRAG) { // ... matrix.set(savedMatrix); matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); end.set(event.getX(), event.getY()); Dragable = true; } else if (mode == ZOOM) { Zoomable = true; float newDist = spacing(event); if (newDist > 10f) { matrix.set(savedMatrix); float scale = newDist / oldDist; matrix.postScale(scale, scale, mid.x, mid.y); // get the current size of drawable after zoomed if (scale > 1) {// When Enlarge drawable_width = drawable_width * scale + drawable_width; drawable_height = drawable_height * scale + drawable_height; } else { // When Narrow drawable_height = drawable_height - drawable_width * scale; drawable_height = drawable_height - drawable_width * scale; } } } } break; } this.setImageMatrix(matrix); return true; } // 两点间的距离 /** * @param event * @return float the distance of two point * */ 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); } // 两点的中心坐标 /** * @param PointF * to record one point * @param event * */ private void midPoint(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); } /** * the class extends GestureDetector to deal double tap * */ private class mGesture extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDoubleTap(MotionEvent e) { Moveable = true; return super.onDoubleTap(e); } } // 判断有没有越界 /** * @param x2 * @param y2 * @Descript the point in top and left * */ public void decideAnimation(float x2, float y2) { float top = imageview_height - drawable_height; float left = imageview_width - drawable_width;// Log.i("", "imageview_height=" + imageview_height + " imageview_width="// + imageview_width);// Log.i("", "drawable_height=" + drawable_height + " drawable_width="// + drawable_width);// Log.i("", "x2=" + x2 + "y2=" + y2);// Log.i("", "left=" + left + "top=" + top); if (drawable_width > imageview_width) { if (x2 < left) { x_point = left; } if (x2 > 0) { x_point = 0; } } if (drawable_height > imageview_height) { if (y2 < top) { y_point = top; } if (y2 > 0) { y_point = 0; } } if (drawable_width < imageview_width) { if (x2 > left) { x_point = left; } if (x2 < 0) { x_point = 0; } } if (drawable_height < imageview_height) { if (y2 > top) { y_point = top; } if (y2 < 0) { y_point = 0; } } // 发送动画请求 Message msg = new Message(); Bundle b = new Bundle(); b.putFloat("x_point", x_point); b.putFloat("y_point", y_point); msg.setData(b); handler.sendMessageAtTime(msg, 100); } // 实现动画效果 Handler handler = new Handler() { float temp_x; float temp_y; @Override public void handleMessage(Message msg) { super.handleMessage(msg); Bundle b = msg.getData(); temp_x = b.getFloat("x_point"); temp_y = b.getFloat("y_point");// Log.i("", "temp_x: " + temp_x + "temp_y: " + temp_y); matrix.setTranslate(temp_x, temp_y); setImageMatrix(matrix); } };}