Android圖片的縮放和拖動

fefef123 9年前發布 | 1K 次閱讀 Java Android


import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.RectF;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.widget.Toast;

public class PhotoViewer extends Activity implements OnTouchListener {

private static final String TAG = "PhotoViewer";  
public static final int RESULT_CODE_NOFOUND = 200;  

Matrix matrix = new Matrix();  
Matrix savedMatrix = new Matrix();  
DisplayMetrics dm;  
ImageView imgView;  
Bitmap bitmap;  

/** 最小縮放比例 */  
float minScaleR = 0.5f;// 1.0f;  
/** 最大縮放比例 */  
static final float MAX_SCALE = 100f;// 10f;  

/** 初始狀態 */  
static final int NONE = 0;  
/** 拖動 */  
static final int DRAG = 1;  
/** 縮放 */  
static final int ZOOM = 2;  

/** 當前模式 */  
int mode = NONE;  

PointF prev = new PointF();  
PointF mid = new PointF();  
float dist = 1f;  

@Override  
public void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    // 獲取圖片資源  
    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.tchip);  

    setContentView(R.layout.activity_main);  

    imgView = (ImageView) findViewById(R.id.imageView1);// 獲取控件  
    imgView.setImageBitmap(bitmap);// 填充控件  
    imgView.setOnTouchListener(this);// 設置觸屏監聽  
    dm = new DisplayMetrics();  
    getWindowManager().getDefaultDisplay().getMetrics(dm);// 獲取分辨率  
    // minZoom();  
    center();  
    imgView.setImageMatrix(matrix);  

}  

// public void SureOnClick(View v)  
// {  
//  
// }  

/** 
 * 觸屏監聽 
 */  
public boolean onTouch(View v, MotionEvent event) {  

    switch (event.getAction() & MotionEvent.ACTION_MASK) {  
    // 主點按下  
    case MotionEvent.ACTION_DOWN:  
        savedMatrix.set(matrix);  
        prev.set(event.getX(), event.getY());  
        mode = DRAG;  
        break;  
    // 副點按下  
    case MotionEvent.ACTION_POINTER_DOWN:  
        dist = spacing(event);  
        // 如果連續兩點距離大于10,則判定為多點模式  
        if (spacing(event) > 10f) {  
            savedMatrix.set(matrix);  
            midPoint(mid, event);  
            mode = ZOOM;  
        }  
        break;  
    case MotionEvent.ACTION_UP:  
    case MotionEvent.ACTION_POINTER_UP:  
        mode = NONE;  
        // savedMatrix.set(matrix);  
        break;  
    case MotionEvent.ACTION_MOVE:  
        if (mode == DRAG) {  
            matrix.set(savedMatrix);  
            matrix.postTranslate(event.getX() - prev.x, event.getY()  
                    - prev.y);  
        } else if (mode == ZOOM) {  
            float newDist = spacing(event);  
            if (newDist > 10f) {  
                matrix.set(savedMatrix);  
                float tScale = newDist / dist;  
                matrix.postScale(tScale, tScale, mid.x, mid.y);  
            }  
        }  
        break;  
    }  
    imgView.setImageMatrix(matrix);  
    CheckView();  
    return true;  
}  

/** 
 * 限制最大最小縮放比例,自動居中 
 */  
private void CheckView() {  
    float p[] = new float[9];  
    matrix.getValues(p);  
    setTitle("縮放級別:" + p[0] + "%");  
    if (mode == ZOOM) {  
        if (p[0] < minScaleR) {  
            // Log.d("", "當前縮放級別:"+p[0]+",最小縮放級別:"+minScaleR);  
            setTitle("縮放級別:" + p[0] + "%");  
            matrix.setScale(minScaleR, minScaleR);  
        }  
        if (p[0] > MAX_SCALE) {  
            // Log.d("", "當前縮放級別:"+p[0]+",最大縮放級別:"+MAX_SCALE);  
            matrix.set(savedMatrix);  
        }  
    }  
    center();  
}  

/** 
 * 最小縮放比例,最大為100% 
 */  
private void minZoom() {  
    minScaleR = Math.min(  
            (float) dm.widthPixels / (float) bitmap.getWidth(),  
            (float) dm.heightPixels / (float) bitmap.getHeight());  
    if (minScaleR < 1.0) {  
        matrix.postScale(minScaleR, minScaleR);  
    }  
}  

private void center() {  
    center(true, true);  
}  

/** 
 * 橫向、縱向居中 
 */  
protected void center(boolean horizontal, boolean vertical) {  

    Matrix m = new Matrix();  
    m.set(matrix);  
    RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());  
    m.mapRect(rect);  

    float height = rect.height();  
    float width = rect.width();  

    float deltaX = 0, deltaY = 0;  

    if (vertical) {  
        // 圖片小于屏幕大小,則居中顯示。大于屏幕,上方留空則往上移,下方留空則往下移  
        int screenHeight = dm.heightPixels;  

        if (height < screenHeight) {  
            //deltaY = (screenHeight - height) / 2 - rect.top;  
        } else  

        if (rect.top > 0) {  
            deltaY = -rect.top;  
        } else if (rect.bottom < screenHeight) {  
            deltaY = imgView.getHeight() - rect.bottom;  
        }  
    }  

    if (horizontal) {  
        int screenWidth = dm.widthPixels;  
        if (width < screenWidth) {  
            deltaX = (screenWidth - width) / 2 - rect.left;  
        } else if (rect.left > 0) {  
            deltaX = -rect.left;  
        } else if (rect.right < screenWidth) {  
            deltaX = screenWidth - rect.right;  
        }  
    }  
    matrix.postTranslate(deltaX, deltaY);  
}  

/** 
 * 兩點的距離 
 */  
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);  
}  

public static class ImageViewOnClickListener implements  
        View.OnClickListener {  
    private Context context;  
    private String img_path;  

    public ImageViewOnClickListener(Context context, String img_path) {  
        this.img_path = img_path;  
        this.context = context;  
    }  

    @Override  
    public void onClick(View v) {  
        if (img_path != null) {  
            // Toast.makeText(context, "TChip", Toast.LENGTH_SHORT).show();  
            // Intent intent = new Intent(context, PhotoViewer.class);  
            // intent.putExtra("PhotoPath", img_path);  
            // context.startActivity(intent);  
        }  

    }  
}  

} </pre>

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