Android中使用手勢Gesture實現圖片放縮

jopen 11年前發布 | 26K 次閱讀 Android Android開發 移動開發

在本實例中,通過手指滑動來實現圖片放縮,用戶只要在圖片上隨意“揮動手指”,圖片就可被放縮,從左向右揮動時,圖片被放大,當從右向左揮動時圖片被縮小:揮動速度越快,縮放比越大。代碼如下:</span>

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.widget.ImageView;

public class MainActivity extends Activity implements OnGestureListener { // 定義手勢檢測器實例 private GestureDetector detector; // 定義ImageView實例 private ImageView imageView; // 定義初始的圖片資源 private Bitmap bitmap; // 定義圖片的寬、高 private int width, height; // 記錄當前的縮放比 private float currentScale = 1; // 控制圖片縮放的Matrix對象 private Matrix matrix;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // 創建手勢檢測器
    detector = new GestureDetector(this);
    imageView = (ImageView) findViewById(R.id.activity_main_image);
    matrix = new Matrix();
    // 獲取被放縮的源圖片
    bitmap = BitmapFactory.decodeResource(this.getResources(),
            R.drawable.image5);
    // 獲得位圖寬
    width = bitmap.getWidth();
    // 獲得位圖高
    height = bitmap.getHeight();
    // 設置ImageVIew初始化時顯示的圖片
    imageView.setImageBitmap(BitmapFactory.decodeResource(
            this.getResources(), R.drawable.image5));
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    // 將該Activity上的觸碰事件交給GestureDetector處理
    return detector.onTouchEvent(event);
}

@Override
public boolean onDown(MotionEvent e) {
    return false;
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
    velocityX = velocityX > 4000 ? 4000 : velocityX;
    velocityX = velocityX < -4000 ? -4000 : velocityX;
    // 根據手勢的速度來計算縮放比,如果velocityX>0,放大圖像,否則縮小圖像
    currentScale += currentScale * velocityX / 4000.0f;
    // 保證currentScale不會等于0
    currentScale = currentScale > 0.01 ? currentScale : 0.01f;
    // 重置Matrix
    matrix.reset();
    // 縮放Matrix
    matrix.setScale(currentScale, currentScale, 160, 200);
    BitmapDrawable tmp = (BitmapDrawable) imageView.getDrawable();
    // 如果圖片還未回收,先強制回收該圖片
    if (!tmp.getBitmap().isRecycled()) {
        tmp.getBitmap().recycle();
    }
    // 根據原始位圖和Matrix創建新圖片
    Bitmap bitmap2 = Bitmap.createBitmap(bitmap, 0, 0, width, height,
            matrix, true);
    // 顯示新的位圖
    imageView.setImageBitmap(bitmap2);
    return false;
}

@Override
public void onLongPress(MotionEvent e) {
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {
    return false;
}

@Override
public void onShowPress(MotionEvent e) {
}

@Override
public boolean onSingleTapUp(MotionEvent e) {
    return false;
}

}</pre></span>

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