ZNDS智能电视网 推荐当贝市场

TV应用下载 / 资源分享区

软件下载 | 游戏 | 讨论 | 电视计算器

综合交流 / 评测 / 活动区

交流区 | 测硬件 | 网站活动 | Z币中心

新手入门 / 进阶 / 社区互助

新手 | 你问我答 | 免费刷机救砖 | ROM固件

查看: 14142|回复: 0
上一主题 下一主题
[教程]

android图片缩放,拖拽

[复制链接]
跳转到指定楼层
楼主
发表于 2013-8-28 16:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
6   
yi 工具类   
[java] 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;   
    }   
}   
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[java] 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;   
    }   
}   
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;   
    }   
}   
   

上一篇:Android使用sharedpreference实现记住密码功能
下一篇:android条形码扫描(留着自己学习)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条

Archiver|新帖|标签|软件|Sitemap|ZNDS智能电视网 ( 苏ICP备2023012627号 )

网络信息服务信用承诺书 | 增值电信业务经营许可证:苏B2-20221768 丨 苏公网安备 32011402011373号

GMT+8, 2025-8-5 10:37 , Processed in 0.074710 second(s), 15 queries , Redis On.

Powered by Discuz!

监督举报:report#znds.com (请将#替换为@)

© 2007-2025 ZNDS.Com

快速回复 返回顶部 返回列表