天天看點

圖檔縮放,拖拽等操作

之前做項目要對圖檔的檢視,然後就自己寫了一個,适合對圖檔的浏覽,跟系統圖庫的效果一樣哦,先貼一張美女圖檔,聽說有美女,男人就會多看一眼,不知道是不是真的,哈哈

圖檔縮放,拖拽等操作

布局檔案需要注意的一點是 scaletype一定要是 matrix,這樣才能對圖檔進行一系列的矩陣操作,例如放大縮小,拖拽,等等

圖檔縮放,拖拽等操作

<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"  

    xmlns:tools="http://schemas.android.com/tools"  

    android:layout_width="fill_parent"  

    android:layout_height="fill_parent" >  

    <imageview  

        android:id="@+id/imageview1"  

        android:layout_width="fill_parent"  

        android:layout_height="fill_parent"  

        android:scaletype="matrix" />  

</relativelayout>  

代碼我都有注釋,直接上代碼咯

圖檔縮放,拖拽等操作

package com.example.zoomanddrafting;  

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;  

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 = 1.0f;  

    /** 最大縮放比例*/  

    static final float max_scale = 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.item);  

        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;  

            }  

        case motionevent.action_up:  

        case motionevent.action_pointer_up:  

            mode = none;  

            //savedmatrix.set(matrix);  

        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);  

                }  

        }  

        checkview();  

        return true;  

     * 限制最大最小縮放比例,自動居中 

    private void checkview() {  

        float p[] = new float[9];  

        matrix.getvalues(p);  

        if (mode == zoom) {  

            if (p[0] < minscaler) {  

                //log.d("", "目前縮放級别:"+p[0]+",最小縮放級别:"+minscaler);  

                matrix.setscale(minscaler, minscaler);  

            if (p[0] > max_scale) {  

                //log.d("", "目前縮放級别:"+p[0]+",最大縮放級别:"+max_scale);  

     * 最小縮放比例,最大為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);  

}  

繼續閱讀