編輯:關於Android編程
要實現圖片在手指點擊後移動和縮放有好幾種方法,在這裡是通過onTouch來實現的。
實例代碼如下:
首先是在View中有一個ImageView
iv.setOnTouchListener(this);
private PointF startPoint = new PointF();// 獲取圖片的原始坐標 // 設置觸摸模式 private int mode = 0, single = 1, multi = 2;// 設置點擊的模式,是單點觸摸還是多點 private Matrix matrix = new Matrix(); private Matrix currentMatrix = new Matrix(); private float startDistance; // 兩點開始的距離 private PointF midPoint; // 兩點的中心位置
@Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN:// 表示用戶開始觸摸 mode = single; currentMatrix.set(iv.getImageMatrix()); startPoint.set(event.getX(), event.getY()); break; case MotionEvent.ACTION_POINTER_DOWN:// 當屏幕上已經有觸點(手指),又有一個手指按下屏幕 mode = multi; startDistance = getDistance(event); getMidPoint(event); currentMatrix.set(iv.getImageMatrix()); midPoint = getMidPoint(event); break; case MotionEvent.ACTION_MOVE:// 手指在屏幕上移動,該事件會不斷觸發 if (mode == single) { float x = event.getX() - startPoint.x; float y = event.getY() - startPoint.y; matrix.set(currentMatrix); matrix.postTranslate(x, y); } else if (mode == multi) { float endDistance = getDistance(event); if (endDistance > 10f) { float sclace = endDistance / startDistance; matrix.set(currentMatrix); matrix.postScale(sclace, sclace, midPoint.x, midPoint.y); } } break; case MotionEvent.ACTION_UP:// 手指離開屏幕 case MotionEvent.ACTION_POINTER_UP:// 當一個手指離開屏幕,但在屏幕上還有觸點。 mode = 0; break; default: break; } iv.setImageMatrix(matrix); return true; }
移動圖片:
currentMatrix代表點擊時圖片的當前位置
startPoint是點擊時圖片的坐標點
matrix.set(currentMatrix);matrix.postTranslate(x, y);
先獲取圖片的位置然後進行平移操作,平移的距離是手指移動的距離。
圖片縮放:
由於圖片的縮放要用兩個手指來實現,所以要用到MotionEvent.ACTION_POINTER_DOWN
startDistance是開始按下時兩個手指間的距離,
midPoint是按下時兩點間的中心,
matrix.postScale(sclace, sclace, midPoint.x, midPoint.y);這幾個參數表示X軸和y軸縮放的比例,和以那個坐標點開始縮放。
下面是getMidPoint和getDistance
private PointF getMidPoint(MotionEvent event) { float midx=(event.getX(0)+event.getX(1))/2; float midy=(event.getY(0)+event.getY(1))/2; return new PointF(midx, midy); } private float getDistance(MotionEvent event) { float dx=event.getX(1)-event.getX(0); float dy=event.getY(1)-event.getY(0); return FloatMath.sqrt(dx*dx+dy*dy); }
1.View基本知識(1)view的層次結構:ViewGroup也是View;(2)view的位置參數:top、left、right、bottom,分別對應View的左上
1、View和ViewRootViewRoot從名稱上來理解似乎是“View樹的根”,這很容易讓人產生誤解。因為ViewRoot並不屬於View樹
大家都知道,現在安裝Android系統的手機版本和設備千差萬別,在模擬器上運行良好的程序安裝到某款手機上說不定就出現崩潰的現象,開發者個人不可能購買所有設備逐個調試,所以
Android 內存優化是一個很重要的問題,而UI優化有是重中之重。 該標簽在優化UI結構時起到很重要的作用,目的是通過刪減多余或者額外的層級,從而優化整個UI Layo