public class MyImageView extends ImageView { private static final int SCALE_REDUCE_INIT = 0; private static final int SCALING = 1; private static final int SCALE_ADD_INIT = 2; /** * 控件宽度1/2 */ private int mCenterWidth; /** * 控件高度1/2 */ private int mCenterHeight; /** * 缩放是否结束 */ private boolean isFinish = true; public MyImageView(Context context) { this(context, null); } public MyImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (changed) { int mWidth = getWidth() - getPaddingLeft() - getPaddingRight(); int mHeight = getHeight() - getPaddingTop() - getPaddingBottom(); mCenterWidth = mWidth / 2; mCenterHeight = mHeight / 2; Drawable drawable = getDrawable(); BitmapDrawable bd = (BitmapDrawable) drawable; bd.setAntiAlias(true); } } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //float X = event.getX(); //float Y = event.getY(); mScaleHandler.sendEmptyMessage(SCALE_REDUCE_INIT); break; case MotionEvent.ACTION_UP: mScaleHandler.sendEmptyMessage(SCALE_ADD_INIT); break; } return true; } /** * 控制缩放Handler */ private final Handler mScaleHandler = new Handler() { private Matrix matrix = new Matrix(); private int count = 0; private float mMinScale = 0.8f; private float scale; private boolean isClicked;//是否调用了点击事件 public void handleMessage(Message msg) { matrix.set(getImageMatrix()); switch (msg.what) { case SCALE_REDUCE_INIT: if (!isFinish) { mScaleHandler.sendEmptyMessage(SCALE_REDUCE_INIT); } else { isFinish = false; count = 0; scale = (float) Math.sqrt(Math.sqrt(mMinScale)); beginScale(matrix, scale); mScaleHandler.sendEmptyMessage(SCALING); } break; case SCALING: beginScale(matrix, scale); if (count < 4) { mScaleHandler.sendEmptyMessage(SCALING); } else { isFinish = true; if (MyImageView.this.mOnViewClickListener != null && !isClicked) { isClicked = true; MyImageView.this.mOnViewClickListener.onViewClick(MyImageView.this); } else { isClicked = false; } } ++count; break; case SCALE_ADD_INIT: if (!isFinish) { mScaleHandler.sendEmptyMessage(SCALE_ADD_INIT); } else { isFinish = false; count = 0; scale = (float) Math.sqrt(Math.sqrt(1.0f / mMinScale)); beginScale(matrix, scale); mScaleHandler.sendEmptyMessage(SCALING); } break; } } }; protected void sleep(int time) { try { Thread.sleep(time); } catch (InterruptedException e) { e.printStackTrace(); } } /** * 缩放 * * @param matrix matrix * @param scale scale */ private synchronized void beginScale(Matrix matrix, float scale) { matrix.postScale(scale, scale, mCenterWidth, mCenterHeight); setImageMatrix(matrix); } /** * 接口回调 */ private OnViewClickListener mOnViewClickListener; public void setOnViewClickListener(OnViewClickListener mOnViewClickListener) { this.mOnViewClickListener = mOnViewClickListener; } public static interface OnViewClickListener { void onViewClick(MyImageView view); } }