Android之關于手勢操作圖片的縮放與移動

jopen 12年前發布 | 76K 次閱讀 Android Android開發 移動開發

在Android中實現手勢對于圖片的操作,首先需要對MotionEvent以及Matrix兩個類有所了解實現對手勢的識別以及圖片變動的操作。
在實現該功能時候需要在xml中要將圖片的縮放格式改成Matrix才行.

下面代碼主要實現兩個demo,一個是關于matrix的簡單測試以及圖片的手勢縮放與移動demo.。。

XML代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_height="fill_parent" android:layout_width="fill_parent" android:id="@+id/linearLayout1" android:weightSum="1">
        <ImageView android:layout_width="wrap_content" android:id="@+id/imag" android:layout_height="wrap_content" android:src="@drawable/a"
        android:layout_gravity="center"
        android:scaleType="matrix"
        ></ImageView>
        <ImageView android:layout_width="wrap_content" 

        android:id="@+id/imag1" 
        android:scaleType="matrix"
        android:layout_height="wrap_content"></ImageView>
    </LinearLayout>
 

實現代碼:

package hfut.gmm;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PointF;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.FloatMath;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.view.View.OnTouchListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;

public class Img_control extends Activity implements OnTouchListener {//implements OnTouchListener {
    private ImageView imgview;
    private ImageView img;


    private Matrix matrix=new Matrix();
    private Matrix savedMatrix=new Matrix();

    static final int NONE = 0;  
    static final int DRAG = 1;  
    static final int ZOOM = 2;  
    int mode = NONE;  

    // Remember some things for zooming  
    PointF start = new PointF();  
    PointF mid = new PointF();  
    float oldDist = 1f;  

    //private GestureDetector gesture;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        this.setContentView(R.layout.img_control);
        imgview=(ImageView)this.findViewById(R.id.imag1);
        imgview.setAnimation(AnimationUtils.loadAnimation(this, R.anim.newanim));


        img=(ImageView)this.findViewById(R.id.imag);
        Matrix mt=img.getImageMatrix(); 
        //mt.postRotate(30);
        mt.postScale(0.5f,0.5f);mt.postScale(1.5f,1.5f);
        mt.postRotate(30, 130, 100);
        mt.postTranslate(100, 10);

        img.setImageMatrix(mt);


        //imgview.setLongClickable(true);

        imgview.setImageBitmap(BitmapFactory.decodeResource(this.getResources(), R.drawable.a));
        imgview.setOnTouchListener(this);
        imgview.setLongClickable(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 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);  
}  
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        // TODO Auto-generated method stub
        /*
        Log.d("Infor", "類別:"+event.getAction());
        Log.d("Infor", "mask:"+event.getActionMasked());
        Log.d("Infor", "index:"+event.getActionIndex());
        Log.d("Infor", "points:"+event.getPointerCount());*/
        Log.d("Infor", "size:"+event.getSize());
        if(event.getActionMasked()==MotionEvent.ACTION_POINTER_UP)
            Log.d("Infor", "多點操作");
        switch(event.getActionMasked()){
        case MotionEvent.ACTION_DOWN:
              matrix.set(imgview.getImageMatrix());
              savedMatrix.set(matrix);
              start.set(event.getX(),event.getY());
              Log.d("Infor", "觸摸了...");
              mode=DRAG;
              break;
        case MotionEvent.ACTION_POINTER_DOWN:  //多點觸控
             oldDist=this.spacing(event);
            if(oldDist>10f){
             Log.d("Infor", "oldDist"+oldDist);
             savedMatrix.set(matrix);
             midPoint(mid,event);
             mode=ZOOM;
            }
            break;
        case MotionEvent.ACTION_POINTER_UP:
            mode=NONE;
            break;
        case MotionEvent.ACTION_MOVE:
            if(mode==DRAG){         //此實現圖片的拖動功能...
                matrix.set(savedMatrix);
                matrix.postTranslate(event.getX()-start.x, event.getY()-start.y);
            }
                else if(mode==ZOOM){// 此實現圖片的縮放功能...
             float newDist=spacing(event);
             if(newDist>10){
                 matrix.set(savedMatrix);
                 float scale=newDist/oldDist;
                 matrix.postScale(scale, scale, mid.x, mid.y);               
             }
                }
            break;
        }
        imgview.setImageMatrix(matrix);
        return false;
    }   
}


 

 

運行結果如下:

 

 

 

Android之關于手勢操作圖片的縮放與移動

Android之關于手勢操作圖片的縮放與移動

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!