zl程序教程

您现在的位置是:首页 >  移动开发

当前栏目

android图片操作(缩放移动)实例代码

Android实例代码 操作 图片 移动 缩放
2023-06-13 09:15:02 时间

view_show.xml

复制代码代码如下:


<?xmlversion="1.0"encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
   <FrameLayout
       android:layout_height="fill_parent"
       android:layout_width="fill_parent">
       <ImageView
           android:id="@+id/view_img"
           android:layout_height="fill_parent"
           android:layout_width="fill_parent"
           android:background="@drawable/camera_gray"/>
       <ImageButton
           android:id="@+id/view_close"
           android:layout_height="wrap_content"
           android:layout_width="wrap_content"
           android:layout_gravity="top|left"
           android:layout_margin="5dip"/>
       <ImageButton
           android:id="@+id/view_del"
           android:layout_height="wrap_content"
           android:layout_width="wrap_content"
           android:layout_gravity="top|right"
           android:layout_margin="5dip"/>
       <ImageButton
           android:id="@+id/view_narrow"
           android:layout_height="wrap_content"
           android:layout_width="wrap_content"
           android:layout_gravity="bottom|center_horizontal"
           android:layout_marginRight="10dip"/>
       <ImageButton
           android:id="@+id/view_amplification"
           android:layout_height="wrap_content"
           android:layout_width="wrap_content"
           android:layout_gravity="bottom|center_horizontal"
           android:layout_marginLeft="10dip"/>
   </FrameLayout>
</LinearLayout>

GalleryViewTouch.java:

复制代码代码如下:


packagecom.kotei.lbs.Anthurium.LawCases;

importandroid.app.Activity;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.Matrix;
importandroid.graphics.PointF;
importandroid.graphics.RectF;
importandroid.os.Bundle;
importandroid.util.DisplayMetrics;
importandroid.util.FloatMath;
importandroid.util.Log;
importandroid.view.MotionEvent;
importandroid.view.View;
importandroid.view.Window;
importandroid.view.View.OnTouchListener;
importandroid.widget.ImageView;
importandroid.widget.ImageView.ScaleType;

/**
 *查看图片的操作
 *@authorhongj
 */
publicclassGalleryViewTouchextendsActivity {
   privateImageViewiv;
    privateBitmapbitmap=null;
       Matrixmatrix=newMatrix();
       MatrixsavedMatrix=newMatrix();
       DisplayMetricsdm;
       floatminScaleR;//最小缩放比例
       staticfinalfloatMAX_SCALE=4f;//最大缩放比例
       staticfinalintNONE=0;//初始状态
       staticfinalintDRAG=1;//拖动
       staticfinalintZOOM=2;//缩放
       intmode=NONE;
       PointFprev=newPointF();
       PointFmid=newPointF();
       floatdist=1f;
   /**Calledwhentheactivityisfirstcreated.*/
   @Override
   publicvoidonCreate(BundlesavedInstanceState){
       super.onCreate(savedInstanceState);
       requestWindowFeature(Window.FEATURE_NO_TITLE);
       setContentView(R.layout.view_show);
       dm=newDisplayMetrics();
       getWindowManager().getDefaultDisplay().getMetrics(dm);//获取分辨率
       bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.bottom_layout_background);
       iv=(ImageView)findViewById(R.id.view_img);
       iv.setImageBitmap(bitmap);
       iv.setOnTouchListener(newImageTouch(bitmap,dm.widthPixels,dm.heightPixels,iv));

   }

   classImageTouchimplementsOnTouchListener{
       privateImageViewiv;
        privateBitmapbitmap=null;
           Matrixmatrix=newMatrix();
           MatrixsavedMatrix=newMatrix();
           intdmwidth,dmheight;
           floatminScaleR;//最小缩放比例
           staticfinalfloatMAX_SCALE=4f;//最大缩放比例
           staticfinalintNONE=0;//初始状态
           staticfinalintDRAG=1;//拖动
           staticfinalintZOOM=2;//缩放
           intmode=NONE;
           PointFprev=newPointF();
           PointFmid=newPointF();
           floatdist=1f;
           ImageTouch(Bitmapbitmap,intwidth,intheight,ImageViewiv){
               this.bitmap=bitmap;
               this.dmwidth=width;
               this.dmheight=height;
               this.iv=iv;
               initImage();
           }
           publicvoidinitImage(){
               if(dmwidth<bitmap.getWidth()||dmheight<bitmap.getHeight()){

                   minZoom();
                   center();
                   iv.setImageMatrix(matrix);
               }else{
                   iv.setScaleType(ScaleType.CENTER);
               }
           }
       @Override

       publicbooleanonTouch(Viewv,MotionEventevent){
            switch(event.getAction()&MotionEvent.ACTION_MASK){
               //主点按下
               caseMotionEvent.ACTION_DOWN:
                   Log.d("System.out","ACTION_DOWN");
                   savedMatrix.set(matrix);
                   prev.set(event.getX(),event.getY());
                   mode=DRAG;
                   break;//副点按下
               caseMotionEvent.ACTION_POINTER_DOWN:
                   Log.d("System.out","ACTION_POINTER_DOWN");
                   dist=spacing(event);//如果连续两点距离大于10,则判定为多点模式
                   if(spacing(event)>10f){
                       savedMatrix.set(matrix);
                       midPoint(mid,event);
                       mode=ZOOM;
                   }
                   break;
               caseMotionEvent.ACTION_UP:
               caseMotionEvent.ACTION_POINTER_UP:
                   mode=NONE;
                   break;
               caseMotionEvent.ACTION_MOVE:
                   if(mode==DRAG){
                       matrix.set(savedMatrix);
                       matrix.postTranslate(event.getX()-prev.x,event.getY()
                               -prev.y);

                   }elseif(mode==ZOOM){
                       floatnewDist=spacing(event);
                       if(newDist>10f){
                           matrix.set(savedMatrix);
                           floattScale=newDist/dist;
                           matrix.postScale(tScale,tScale,mid.x,mid.y);
                       }
                   }
                   break;
               }

               iv.setImageMatrix(matrix);
               if(mode!=NONE)
              CheckView();

               returntrue;
       }
        privatevoidCheckView(){
               floatp[]=newfloat[9];
               matrix.getValues(p);
               if(mode==ZOOM){
                   if(p[0]<minScaleR){
                       matrix.setScale(minScaleR,minScaleR);
                   }
                   if(p[0]>MAX_SCALE){
                       matrix.set(savedMatrix);
                   }
               }
               center();
           }

        publicvoidminZoom(){
               Log.i("test",bitmap.getWidth()+"");
               Log.i("test",bitmap.getHeight()+"");
               minScaleR=Math.min(
                       (float)dmwidth/(float)bitmap.getWidth(),
                       (float)dmheight/(float)bitmap.getHeight());
               if(minScaleR<1.0){
                   matrix.postScale(minScaleR,minScaleR);
               }
           }
         protectedvoidcenter(booleanhorizontal,booleanvertical){
               Matrixm=newMatrix();
               m.set(matrix);
               RectFrect=newRectF(0,0,bitmap.getWidth(),bitmap.getHeight());
               m.mapRect(rect);
               floatheight=rect.height();
               floatwidth=rect.width();
               Log.d("System.out",rect.top+"************"+rect.bottom);
               floatdeltaX=0,deltaY=0;
               if(vertical){//图片小于屏幕大小,则居中显示。大于屏幕,上方留空则往上移,下方留空则往下移

                   intscreenHeight=dmheight;
                   if(height<screenHeight){
                       deltaY=(screenHeight-height)/2-rect.top;
                   }elseif(rect.top>0){
                       deltaY=-rect.top;
                   }elseif(rect.bottom<screenHeight){
                       deltaY=iv.getHeight()-rect.bottom;
                   }
                   //deltaY-=50;
               }
               if(horizontal){
                   intscreenWidth=dmwidth;
                   if(width<screenWidth){
                       deltaX=(screenWidth-width)/2-rect.left;
                   }elseif(rect.left>0){
                       deltaX=-rect.left;
                   }elseif(rect.right<screenWidth){
                       deltaX=screenWidth-rect.right;
                   }
               }
               matrix.postTranslate(deltaX,deltaY);
           }
        publicvoidcenter(){
               center(true,true);
           }
        privatefloatspacing(MotionEventevent){
               floatx=event.getX(0)-event.getX(1);
               floaty=event.getY(0)-event.getY(1);
               returnFloatMath.sqrt(x*x+y*y);
           }

           /***两点的中点*/
           privatevoidmidPoint(PointFpoint,MotionEventevent){
               floatx=event.getX(0)+event.getX(1);
               floaty=event.getY(0)+event.getY(1);
               point.set(x/2,y/2);
           }
   }
}