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

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

先看一下微信的效果

显示


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

拖动

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

旋转

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

无限缩小

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

无限放大

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

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



通过 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;//上一个ImageViewprivate ImageView lastImageView;private LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT);/** Called when the activity is first created. */@Overridepublic 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() {@Overridepublic void onClick(View v) {small(); }});/* 放大按钮onClickListener */zoomout.setOnClickListener(new Button.OnClickListener() {@Override       public void onClick(View v) {big();} });rotate.setOnClickListener(new Button.OnClickListener() {@Overridepublic void onClick(View v) {rotate();}});zoomControll = (LinearLayout)findViewById(R.id.zoomcontroll);}  @Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubLog.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><LinearLayoutandroid: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"/><Viewandroid: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"/><Viewandroid: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捣鼓了半天 才弄出 不容易啊

效果如下:

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


可以放大 缩小 旋转

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

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








更多相关文章

  1. 流媒体开发之-服务器图片的加载
  2. Android 实现推送功能
  3. Android拨打电话功能实例详解
  4. Android摇一摇功能实现(摇一摇监听)
  5. Android开发教程--设置ImageView图片的显示比例
  6. Android 各 API Level 权限变更和功能限制汇总
  7. 麦子学院android老师分享android实现listview异步加载图片的方法
  8. Android记事本NotePad应用功能拓展(二)
  9. Android Glide加载图片,宽度占满屏幕高度自适应

随机推荐

  1. Android(安卓)升级服务,哪家厂商做得最好?
  2. android APP性能优化总结
  3. Android(安卓)内存管理的相关知识
  4. android跳转小程序并返回遇到的坑点和解
  5. 2.[WP Developer体验Andriod开发]Andriod
  6. android 内存泄露原因以及排查和解决方案
  7. android apk自动升级实现
  8. Android(安卓)Mp3格式录音,含有暂停,计时功
  9. Android获取手机号码(问题)
  10. Android(安卓)UI设计之自定义SwitchButto