Android應用開發之實現圖片的拖拽顯示

OnTouchListener

      OnTouchListener接口是用來處理手機屏幕事件的監聽接口,當爲View的範圍內觸摸按下、擡起或滑動等動作時都會觸發該事件。該接口中的監聽方法簽名如下。

Java代碼:
public boolean onTouch(View v, MotionEvent event)
  參數v:參數v同樣爲事件源對象。
  參數event:參數event爲事件封裝類的對象,其中封裝了觸發事件的詳細信息,同樣包括事件的類型、觸發時間等信息

 

Matrix

Matrix的操作,總共分爲translate(平移),rotate(旋轉),scale(縮放)和skew(傾斜)四種,每一種變換在Android的API裏都提供了set, post和pre三種操作方式,除了translate,其他三種操作都可以指定中心點。set是直接設置Matrix的值,每次set一次,整個Matrix的數組都會變掉。post是後乘,當前的矩陣乘以參數給出的矩陣。可以連續多次使用post,來完成所需的整個變換。例如,要將一個圖片旋轉30度,然後平移到(100,100)的地方,那麼可以這樣做:

Matrix m = new Matrix();     
m.postRotate(30);    
m.postTranslate(100, 100); 

實驗

       實驗圖片的拖拽顯示。

 

佈局

<ImageView
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:id="@+id/imageView"
       android:src="@drawable/cl"
       android:scaleType="matrix"
        />

Activity:

…
	private void init() {
		imageView = (ImageView) this.findViewById(R.id.imageView);		
		imageView.setOnTouchListener(new ImageViewOnTouchListener());
	}	
	private final class ImageViewOnTouchListener 
                                implements OnTouchListener{

		PointF startPoint = new PointF();
		Matrix matrix = new Matrix();
		
		public boolean onTouch(View v, MotionEvent event) {
			
//			Log.i("TAG", String.valueOf(event.getX()) + " " 
                                      +String.valueOf(event.getY()));
			switch(event.getAction() & MotionEvent.ACTION_MASK){     // MotionEvent.ACTION_MASK=0xff
			case MotionEvent.ACTION_DOWN:
				startPoint.set(event.getX(), event.getY());
				break;
							
			case MotionEvent.ACTION_MOVE://移動過程,該事件會不斷被觸發
				float dx = event.getX()-startPoint.x;
				float dy = event.getY()-startPoint.y;
				matrix.postTranslate(dx, dy);
				startPoint.set(event.getX(), event.getY());
				
				break;
				
			case MotionEvent.ACTION_POINTER_DOWN://如果已經有手指壓住屏幕, 
                                               再有手指壓下屏幕,就會觸發該事件
				break;
				
			case MotionEvent.ACTION_UP:
			case MotionEvent.ACTION_POINTER_UP://有手指離開屏幕,但還有手指
                                                     壓住屏幕,就會觸發該事件
				break;
			}
			imageView.setImageMatrix(matrix);
			return true;
		}
	}
…


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章