首頁(yè) 收藏 QQ群
 網(wǎng)站導(dǎo)航

ZNDS智能電視網(wǎng) 推薦當(dāng)貝市場(chǎng)

TV應(yīng)用下載 / 資源分享區(qū)

軟件下載 | 游戲 | 討論 | 電視計(jì)算器

綜合交流 / 評(píng)測(cè) / 活動(dòng)區(qū)

交流區(qū) | 測(cè)硬件 | 網(wǎng)站活動(dòng) | Z幣中心

新手入門(mén) / 進(jìn)階 / 社區(qū)互助

新手 | 你問(wèn)我答 | 免費(fèi)刷機(jī)救磚 | ROM固件

查看: 12225|回復(fù): 0
上一主題 下一主題
[教程]

android圖片縮放,拖拽

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2013-8-28 16:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
6   
yi 工具類(lèi)   
[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();   
    }   
        
    /** 計(jì)算移動(dòng)距離 */   
    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();   
        }   
    }   
    //拖動(dòng)     
    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();   
    }   
      
    /** 計(jì)算移動(dòng)距離 */   
    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();   
        }   
    }   
    //拖動(dòng)   
    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;// 計(jì)算兩點(diǎn)間的距離     
        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;// 計(jì)算兩點(diǎn)間的距離   
        return pz;   
    }   
}   
   

上一篇:Android使用sharedpreference實(shí)現(xiàn)記住密碼功能
下一篇:android條形碼掃描(留著自己學(xué)習(xí))

相關(guān)帖子

本版積分規(guī)則

Archiver|新帖|標(biāo)簽|軟件|Sitemap|ZNDS智能電視網(wǎng) ( 蘇ICP備2023012627號(hào) )

網(wǎng)絡(luò)信息服務(wù)信用承諾書(shū) | 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證:蘇B2-20221768 丨 蘇公網(wǎng)安備 32011402011373號(hào)

GMT+8, 2024-10-19 20:33 , Processed in 0.075018 second(s), 15 queries , Redis On.

Powered by Discuz!

監(jiān)督舉報(bào):report#znds.com (請(qǐng)將#替換為@)

© 2007-2024 ZNDS.Com

快速回復(fù) 返回頂部 返回列表