android图片操作(缩放移动)实例代码
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);
}
}
}
相关文章
- android开机动画多长时间_Android开机动画及黑屏[通俗易懂]
- android 的hook技术,Android Native Hook技术(一)
- android开发笔记之 Android代码混淆打包
- strictmode android,(十三)Android 性能优化 StrictMode
- 1000套安卓(Android)毕业设计(带论文)、大作业、实例快速下载 (Android Studio)
- android app 退出功能,Android 完美退出 App (Exit)
- android退出app代码,Android应用退出代码各种方式
- 测试android sdk是否安装成功,配置Android SDK
- android sdk安装过程,图文详解Android 3.0 SDK安装教程
- Android angle_android 界面悬停
- 【Android 应用开发】Android 返回堆栈管理 ( 默认启动模式 | 栈顶复用启动模式 | 栈内复用启动模式 | 单实例启动模式 | CLEAR_TOP 标识 )
- 【Android 事件分发】事件分发源码分析 ( ViewGroup 事件传递机制 六 )
- Android中的ProgressBar的android:indeterminate详解手机开发
- Connecting Android to Oracle: The Ultimate Guide for Seamless Integration.(android连接oracle)
- Android通过手势实现的缩放处理实例代码
- Android利用ViewPager实现滑动广告板实例源码
- android动态壁纸调用的简单实例
- android简单图片动画播放的实例代码
- Android截屏保存png图片的实例代码
- android自动安装apk代码实例(不使用apk安装器安装)
- Android获取其他包的Context实例代码
- android实现简单的画画板实例代码
- Unity3D游戏引擎实现在Android中打开WebView的实例
- Android实现抽奖转盘实例代码