android仿快图浏览,图片缩放移动效果

     代码是拿别人的改的 ,原来的有些BUG ,项目加载的都是网络图片 还没弄左右滑动效果


yi 工具类

package com.lin.image;


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Matrix;
import android.graphics.PointF;
import android.graphics.Rect;
import android.util.FloatMath;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.ImageView;

public class MyImageView extends ImageView {
	private    Matrix mMatrix;
    private float bWidth;// 图片宽度
    private float bHeight;
    
    private int dWidth;//屏幕宽度
    private int  dHeight;//屏幕高度
    private float initScale;
    private float mScale;
    private float scale;
    ImageState mapState = new ImageState();
    private float oldDist;
    PointF mStart = new PointF();
    private Bitmap mBitmap;
    float[] values = new float[9];
    
    Matrix initMatrix;
    Matrix mSavedMatrix;
    
	public MyImageView(Context context) {
		super(context);
	     this.setScaleType(ScaleType.MATRIX);
	}
    public void init(MotionEvent event){
        mStart.set(event.getX(), event.getY());
        mSavedMatrix.set(mMatrix);
        
    }
	float rate=1.0f;
	 // 刷新界面
    public void setView() {
    	//rate=rate/10*9;
        // UserUtils.log(TAG, "set view", "set view");
    	//mMatrix.postScale(scale,scale,0,0);
        this.setImageMatrix(mMatrix);
        
        Rect rect = this.getDrawable().getBounds();
        this.getImageMatrix().getValues(values);
        bWidth = rect.width() * values[0];
        bHeight = rect.height() * values[0];

        mapState.left = values[2];
        mapState.top = values[5];
        mapState.right = mapState.left + bWidth;
        mapState.bottom = mapState.top + bHeight;
    }
    private float s=0.9f;
    public void setScale(){
    
        float sX = dWidth / 2;
        float sY = dHeight / 2;

       mMatrix.postScale(s, s, sX, sY);
       setView();
    }
    public void setScreenSize(Context context, int width, int height,Bitmap bitmap) {
    	 mBitmap =bitmap;
    	dWidth = width;
        dHeight = height;
        setImageBitmap(mBitmap);
//        gd = new GestureDetector(context, new LearnGestureListener());

        bWidth = mBitmap.getWidth();
        bHeight = mBitmap.getHeight();
        // mView = (ImageView) findViewById(R.id.imageView);
        float xScale = (float) dWidth / bWidth;
        float yScale = (float) dHeight / bHeight;
        mScale = xScale <= yScale ? xScale : yScale;
      scale = mScale < 1 ? mScale : 1;
        initScale = scale;
        mMatrix = new Matrix();
        mSavedMatrix = new Matrix();
        System.out.println("dwidth==="+dHeight+"  bHeight===="+bHeight);
        // 平移
        mMatrix.postTranslate((dWidth - bWidth) / 2, (dHeight - bHeight) / 2);

        float sX = dWidth / 2;
        float sY = dHeight / 2;
        
        mSavedMatrix.set(mMatrix);
       mMatrix.postScale(scale, scale, sX, sY);
        setView();
    }
    
    /** 计算移动距离 */
    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);
    }
    float backScale;
    //缩放
    public void zoom(MotionEvent event) {

        float newDist = spacing(event);
    	if((mapState.right-mapState.left)>4*dWidth&&newDist>oldDist)
    		return;
        Log.e("lin","oldDist="+oldDist+",newDist=="+newDist);
        if (newDist > 10f&&Math.abs((newDist-oldDist))>10f) {
            scale = newDist / oldDist;
            if (scale < 1) {
                mMatrix.postScale(scale, scale, dWidth / 2, dHeight / 2);
            } else {
                mMatrix.postScale(scale, scale, dWidth / 2, dHeight / 2);
            }
            oldDist=newDist;
        }

        setView();
    }
    
    /**
     * @return the oldDist
     */
    public float getOldDist(MotionEvent event) {
        this.oldDist = this.spacing(event);
        if (oldDist > 10f) {
                mSavedMatrix.set(mMatrix);
        }
        backScale=oldDist;
        Log.e("lin","oldDist="+oldDist);
        return oldDist;
    }
    public void backScale(){
    	 scale = backScale / oldDist;
         if (scale < 1) {
          //   mMatrix.postScale(scale, scale, dWidth / 2, dHeight / 2);
         } else {
        	 if(mapState.right-mapState.left<=dWidth){
        		  scale= dWidth/(mapState.right-mapState.left);
        	
        		 mMatrix.postScale(scale, scale, dWidth / 2, dHeight / 2);
        	      	float h=(dHeight-(mapState.bottom-mapState.top))/2;
        	      	float w=(dWidth-(mapState.right-mapState.left))/2;
        	 		 mMatrix.postTranslate(w-mapState.left,h-mapState.top);
        	 }
         }
 		 setView();
    }
    public void backDrag(){
        if (mapState.left >= 0 || mapState.right <= dWidth
               ||mapState.top >= 0 || mapState.bottom <= dHeight) {
	      	float h=(dHeight-(mapState.bottom-mapState.top))/2;
	      	float w=(dWidth-(mapState.right-mapState.left))/2;
	 		 mMatrix.postTranslate(w-mapState.left,h-mapState.top);
	 		 setView();
        }
    }
    //拖动
    public void drag(MotionEvent event){
    	//Log.i
     	Log.e("lin","left="+mapState.left+",right="+mapState.right
    			+",top="+mapState.top+",bottom="+mapState.bottom);

        mMatrix.set(mSavedMatrix);
        if ((mapState.left <= 0 || mapState.right >= dWidth)
                && (mapState.top <= 0 || mapState.bottom >= dHeight)) {
            mMatrix.postTranslate(event.getX() - mStart.x, event.getY()
                    - mStart.y);
        } else if (mapState.top <= 0 || mapState.bottom >= dHeight) {
            mMatrix.postTranslate(0, event.getY() - mStart.y);
        } else if (mapState.left <= 0 || mapState.right >= dWidth) {
            mMatrix.postTranslate(event.getX() - mStart.x, 0);
        }
        else{
        	  mMatrix.postTranslate(event.getX() - mStart.x, event.getY()-mStart.y);
        }
        //mStart.x=event.getX();
       // mStart.y=event.getY();
        setView();
        
    }
    private class ImageState {
        private float left;
        private float top;
        private float right;
        private float bottom;
    }
}


二, Activity
package com.lin.image;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;

public class ImageScaleActivity extends Activity {
    /** Called when the activity is first created. */
	  MyImageView image;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        image=new MyImageView(this);
        Bitmap bmp=((BitmapDrawable)getResources().getDrawable(R.drawable.totallist)).getBitmap();
        image.setScreenSize(this,getWindowManager().getDefaultDisplay().getWidth(),
        	getWindowManager().getDefaultDisplay().getHeight(),bmp);
        setContentView(image);
    }
    private static final int DRAG=10;
    private static final int  NULL=0;
    private static final int SCALE=11;
    private int mode;
    private float mStartX;
    @Override
    public boolean onTouchEvent(MotionEvent event) {
    	// TODO Auto-generated method stub
    	switch (event.getAction()) {
    	case  MotionEvent.ACTION_DOWN:
    		Log.i("lin","down");
    		mode=DRAG;

    	     mStartX = event.getRawX();
            image.init(event);
    		break;
    	case MotionEvent.ACTION_MOVE:
    		if(mode==SCALE)
    			image.zoom(event);
    		if(mode==DRAG){
                    image.drag(event);
                      return true;
    		}
    		break;
    	case MotionEvent.ACTION_UP:
    		Log.i("lin","up");
    		if(mode==SCALE){
    			image.backScale();
    			mode=NULL;
    		}
    		else if(mode==DRAG){
    			image.backDrag();
    		}
    		break;
    	case MotionEvent.ACTION_POINTER_1_DOWN:
    		Log.i("lin","down1");
    		break;
    	case MotionEvent.ACTION_POINTER_2_DOWN:
    		Log.i("lin","down2");
    		image.getOldDist(event);
    		mode=SCALE;
    		break;
        case MotionEvent.ACTION_POINTER_2_UP:
        	Log.i("lin","up2");

		default:
			break;
		}

    	return super.onTouchEvent(event);
    }
    private float calculate(float x1,  float x2) {

        float pz = x1 - x2;// 计算两点间的距离
        return pz;
    }
}

截图



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值