当前位置: 代码迷 >> Android >> 2011.10.14——— android 模仿微信的图片展示功能 之 基本功能
  详细解决方案

2011.10.14——— android 模仿微信的图片展示功能 之 基本功能

热度:76   发布时间:2016-05-01 19:08:04.0
2011.10.14——— android 仿照微信的图片展示功能 之 基本功能
2011.10.14——— android 仿照微信的图片展示功能 之 基本功能

参考:http://blog.csdn.net/ameyume/article/details/6089334

先看一下微信的效果

显示




拖动



旋转



无限缩小



无限放大



这个就是微信里面图片的基本功能了



通过http://topic.csdn.net/u/20100810/15/5bb5a716-5260-415d-9db4-944a44e551cd.html我们知道 放大 缩小 的做法有两种

1、Matrix
2、动态的更改ImageView的宽和高


在这里 我们先用第一种方法 Matrix试试



package com.lp.image;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.util.DisplayMetrics;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.View.OnTouchListener;import android.widget.Button;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ImageView.ScaleType;public class MainActivity extends Activity implements OnTouchListener{	private static final String TAG = "lp";			/* 相关变量声明 */	private ImageView mImageView;	private Button zoomin;	private Button zoomout;	private Button rotate;	private LinearLayout layoutImage;	private LinearLayout zoomControll;	//是否显示	private boolean isVisible = true;	private Bitmap bmp;	private int id=0;	private int displayWidth;	private int displayHeight;	private float scaleWidth=1;	private float scaleHeight=1;	private int rotateCount = 1;	private float degrees=90;	//上一个ImageView	private ImageView lastImageView;		private LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);		/** Called when the activity is first created. */	@Override	public void onCreate(Bundle savedInstanceState)    {		super.onCreate(savedInstanceState);		/* 加载display.xml Layout */		setContentView(R.layout.main2);				/* 取得屏幕分辨率大小 */		DisplayMetrics dm=new DisplayMetrics();		getWindowManager().getDefaultDisplay().getMetrics(dm);		displayWidth=dm.widthPixels;		displayHeight=dm.heightPixels; 				/* 初始化相关变量 *///		Bundle bundle = this.getIntent().getExtras();//		Integer imageId = bundle.getInt("imageId");//		Log.i(TAG, "onCreate, imageId = " + imageId);              	     		bmp=BitmapFactory.decodeResource(getResources(), R.drawable.img); 		mImageView = (ImageView)findViewById(R.id.myImageView);		mImageView.setImageBitmap(bmp);		mImageView.setOnTouchListener(this);				layoutImage = (LinearLayout)findViewById(R.id.layoutImage);		zoomin = (Button)findViewById(R.id.zoomin);		zoomout = (Button)findViewById(R.id.zoomout); 		rotate = (Button)findViewById(R.id.rotate);				/* 缩小按钮onClickListener */		zoomin.setOnClickListener(new Button.OnClickListener() {			@Override			public void onClick(View v) {				small(); 			}		});				/* 放大按钮onClickListener */		zoomout.setOnClickListener(new Button.OnClickListener() {			@Override       			public void onClick(View v) {				big();			} 		});				rotate.setOnClickListener(new Button.OnClickListener() {						@Override			public void onClick(View v) {				rotate();			}					});						zoomControll = (LinearLayout)findViewById(R.id.zoomcontroll);			}  		@Override	public boolean onTouch(View v, MotionEvent event) {		// TODO Auto-generated method stub		Log.i(TAG, "onTouch...");		if(isVisible){			zoomControll.setVisibility(View.INVISIBLE);			isVisible = false;		}else{			zoomControll.setVisibility(View.VISIBLE);			isVisible = true;		}		return  super.onTouchEvent(event);    	}		/* 图片缩小的method */	private void small()    {		int bmpWidth=bmp.getWidth(); 		int bmpHeight=bmp.getHeight();				Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);				/* 设置图片缩小的比例 */		double scale=0.8;		/* 计算出这次要缩小的比例 */ 		scaleWidth=(float) (scaleWidth*scale); 		scaleHeight=(float) (scaleHeight*scale); 		/* 产生reSize后的Bitmap对象 */		Matrix matrix = new Matrix();		matrix.postScale(scaleWidth, scaleHeight);		Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth, 				bmpHeight,matrix,true); 				if(id==0)      {			/* 如果是第一次按,就删除原来默认的ImageView */			layoutImage.removeView(mImageView);		} else {			/* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */			layoutImage.removeView((ImageView)findViewById(id));		} 				/* 产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */		id++;		ImageView imageView = new ImageView(this);		imageView.setId(id);		imageView.setImageBitmap(resizeBmp);		imageView.setOnTouchListener(this);				layoutImage.addView(imageView,params);		Log.i(TAG, "imageView.getWidth() = " + imageView.getWidth()				+ ", imageView.getHeight() = " + imageView.getHeight());		/* 因为图片放到最大时放大按钮会disable,所以在缩小时把它重设为enable */ 		zoomout.setEnabled(true);	}		/* 图片放大的method */	private void big() {		int bmpWidth=bmp.getWidth();		int bmpHeight=bmp.getHeight();				Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);				/* 设置图片放大的比例 */		double scale=1.25;		/* 计算这次要放大的比例 */		scaleWidth=(float)(scaleWidth*scale);		scaleHeight=(float)(scaleHeight*scale);		/* 产生reSize后的Bitmap对象 */		Matrix matrix = new Matrix();		matrix.postScale(scaleWidth, scaleHeight);		Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth, 				bmpHeight,matrix,true);				if(id==0) {			/* 如果是第一次按,就删除原来设置的ImageView */			layoutImage.removeView(mImageView);		} else {			/* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */ 			layoutImage.removeView((ImageView)findViewById(id));		}				/* 产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */		id++;		ImageView imageView = new ImageView(this);		imageView.setId(id);		imageView.setImageBitmap(resizeBmp);		imageView.setOnTouchListener(this);		layoutImage.addView(imageView,params);		/* 如果再放大会超过屏幕大小,就把Button disable *///		if( scaleWidth * scale * bmpWidth > bmpWidth * 3 ||//			scaleHeight * scale * bmpHeight > bmpWidth * 3 ||//			scaleWidth * scale * bmpWidth > displayWidth * 5 ||//			scaleHeight * scale * bmpHeight > displayHeight * 5) {//				zoomout.setEnabled(false);//			} else {//				zoomout.setEnabled(true);//			}	} 	private void rotate() {		int bmpWidth=bmp.getWidth(); 		int bmpHeight=bmp.getHeight();				Log.i(TAG, "bmpWidth = " + bmpWidth + ", bmpHeight = " + bmpHeight);				/* 设置图片缩小的比例 */		/* 产生reSize后的Bitmap对象 */		if(rotateCount>4){			rotateCount = 1;		}		float rotateDegrees = degrees * rotateCount;				Matrix matrix = new Matrix();		matrix.postRotate(rotateDegrees);		Bitmap resizeBmp = Bitmap.createBitmap(bmp,0,0,bmpWidth, 				bmpHeight,matrix,true); 				if(id==0)      {			/* 如果是第一次按,就删除原来默认的ImageView */			layoutImage.removeView(mImageView);		} else {			/* 如果不是第一次按,就删除上次放大缩小所产生的ImageView */			layoutImage.removeView((ImageView)findViewById(id));		} 				/* 产生新的ImageView,放入reSize的Bitmap对象,再放入Layout中 */		id++;		ImageView imageView = new ImageView(this);		imageView.setId(id);		imageView.setImageBitmap(resizeBmp);		imageView.setOnTouchListener(this);				layoutImage.addView(imageView,params);		Log.i(TAG, "imageView.getWidth() = " + imageView.getWidth()				+ ", imageView.getHeight() = " + imageView.getHeight());				rotateCount++;	}}



xml
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"	android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical"	><FrameLayout     android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:gravity="center"    android:layout_gravity="center"    >	    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"		    android:orientation="vertical"		    android:layout_width="fill_parent"		    android:layout_height="fill_parent"		    android:id="@+id/layoutImage"		    android:gravity="center"		    >		    <ImageView		    	android:id="@+id/myImageView"		    	android:layout_width="fill_parent"		    	android:layout_height="fill_parent"				/>		</LinearLayout>		<LinearLayout			android:orientation="horizontal"			android:layout_width="fill_parent"			android:layout_height="wrap_content"			android:gravity="bottom|right"			android:layout_gravity="bottom"			android:padding="10dip"			android:id="@+id/zoomcontroll"			>						<Button 				android:layout_width="wrap_content"				android:layout_height="wrap_content"				android:background="@drawable/my_rotate_btn"				android:id="@+id/rotate"				/>			<View				android:layout_width="0dip"				android:layout_height="wrap_content"				android:layout_weight="1"				/>			<Button 				android:layout_width="wrap_content"				android:layout_height="wrap_content"				android:background="@drawable/my_zoomin_btn"				android:id="@+id/zoomin"				/>			<View				android:layout_width="2dip"				android:layout_height="wrap_content"				/>				<Button 				android:layout_width="wrap_content"				android:layout_height="wrap_content"				android:background="@drawable/my_zoomout_btn"				android:id="@+id/zoomout"				/>						</LinearLayout></FrameLayout></LinearLayout>


这个xml捣鼓了半天 才弄出 不容易啊

效果如下:




可以放大 缩小 旋转

当然 这里面还有以下几个问题 没有解决:

1、放大超过屏幕显示不出来
2、无限放大内存溢出
3、旋转 放大 缩小的复合变化
4、拖动








1 楼 mmm333zzz 2012-02-28  
可以发一份源码给我吗?  谢谢:  [email protected]
  相关解决方案