Android代码中动态设置图片的大小(自动缩放),位置
- 格式:docx
- 大小:323.08 KB
- 文档页数:2
龙图教育:Android中如何用程序处理图片放大缩小、格式、水印Android中图片的处理(放大缩小,去色,转换格式,增加水印等),多张图片四个方位的图片合成,改变bitmap大小,图片去色等功能Java代码package com.dzh.operateimage;import Android.graphics.Bitmap;import Android.graphics.Bitmap.Config;import Android.graphics.BitmapFactory;import Android.graphics.Canvas;import Android.graphics.ColorMatrix;import Android.graphics.ColorMatrixColorFilter;import Android.graphics.Paint;import Android.graphics.PorterDuff.Mode;import Android.graphics.PorterDuffXfermode;import Android.graphics.Rect;import Android.graphics.RectF;import Android.graphics.drawable.BitmapDrawable;import Android.graphics.drawable.Drawable;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;/*** 处理图片的工具类.*/public class ImageTools {public static final int LEFT = 0;public static final int RIGHT = 1;public static final int TOP = 3;public static final int BOTTOM = 4;/** *//*** 图片去色,返回灰度图片** @param bmpOriginal 传入的图片* @return去色后的图片*/public static Bitmap toGrayscale(Bitmap bmpOriginal) {int width, height;height = bmpOriginal.getHeight();width = bmpOriginal.getWidth();Bitmap bmpGrayscale = Bitmap.createBitmap(width, height,Bitmap.Config.RGB_565);Canvas c = new Canvas(bmpGrayscale);Paint paint = new Paint();ColorMatrix cm = new ColorMatrix();cm.setSaturation(0);ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm); paint.setColorFilter(f);c.drawBitmap(bmpOriginal, 0, 0, paint);return bmpGrayscale;}/** *//*** 去色同时加圆角** @param bmpOriginal 原图* @param pixels 圆角弧度* @return修改后的图片*/public static Bitmap toGrayscale(Bitmap bmpOriginal, int pixels) { return toRoundCorner(toGrayscale(bmpOriginal), pixels);}/** *//*** 把图片变成圆角** @param bitmap 需要修改的图片* @param pixels 圆角的弧度* @return圆角图片*/public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output);final int color = 0xff424242;final Paint paint = new Paint();final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight()); final RectF rectF = new RectF(rect);final float roundPx = pixels;paint.setAntiAlias(true);canvas.drawARGB(0, 0, 0, 0);paint.setColor(color);canvas.drawRoundRect(rectF, roundPx, roundPx, paint);paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));canvas.drawBitmap(bitmap, rect, rect, paint);return output;}/** *//*** 使圆角功能支持BitampDrawable** @param bitmapDrawable* @param pixels* @return*/public static BitmapDrawable toRoundCorner(BitmapDrawable bitmapDrawable, int pixels) {Bitmap bitmap = bitmapDrawable.getBitmap();bitmapDrawable = new BitmapDrawable(toRoundCorner(bitmap, pixels));return bitmapDrawable;}/*** 读取路径中的图片,然后将其转化为缩放后的bitmap** @param path*/public static void saveBefore(String path) {BitmapFactory.Options options = new BitmapFactory.Options();options.inJustDecodeBounds = true;// 获取这个图片的宽和高Bitmap bitmap = BitmapFactory.decodeFile(path, options); // 此时返回bm为空options.inJustDecodeBounds = false;// 计算缩放比int be = (int)(options.outHeight / (float)200);if (be <= 0)be = 1;options.inSampleSize = 2; // 图片长宽各缩小二分之一// 重新读入图片,注意这次要把options.inJustDecodeBounds 设为false哦bitmap = BitmapFactory.decodeFile(path, options);int w = bitmap.getWidth();int h = bitmap.getHeight();System.out.println(w + " " + h);// savePNG_After(bitmap,path);saveJPGE_After(bitmap, path);}/*** 保存图片为PNG** @param bitmap* @param name*/public static void savePNG_After(Bitmap bitmap, String name) { File file = new File(name);try {FileOutputStream out = new FileOutputStream(file);if (press(pressFormat.PNG, 100, out)) { out.flush();out.close();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** 保存图片为JPEG** @param bitmap* @param path*/public static void saveJPGE_After(Bitmap bitmap, String path) {File file = new File(path);try {FileOutputStream out = new FileOutputStream(file);if (press(pressFormat.JPEG, 100, out)) {out.flush();out.close();}} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** 水印** @param bitmap* @return*/public static Bitmap createBitmapForWatermark(Bitmap src, Bitmap watermark) { if (src == null) {return null;}int w = src.getWidth();int h = src.getHeight();int ww = watermark.getWidth();int wh = watermark.getHeight();// create the new blank bitmapBitmap newb = Bitmap.createBitmap(w, h, Config.ARGB_8888);// 创建一个新的和SRC长度宽度一样的位图Canvas cv = new Canvas(newb);// draw src intocv.drawBitmap(src, 0, 0, null);// 在0,0坐标开始画入src// draw watermark intocv.drawBitmap(watermark, w - ww + 5, h - wh + 5, null);// 在src的右下角画入水印// save all clipcv.save(Canvas.ALL_SAVE_FLAG);// 保存// storecv.restore();// 存储return newb;}/*** 图片合成** @return*/public static Bitmap potoMix(int direction, Bitmap... bitmaps) {if (bitmaps.length <= 0) {return null;}if (bitmaps.length == 1) {return bitmaps[0];}Bitmap newBitmap = bitmaps[0];// newBitmap = createBitmapForFotoMix(bitmaps[0],bitmaps[1],direction);for (int i = 1; i < bitmaps.length; i++) {newBitmap = createBitmapForFotoMix(newBitmap, bitmaps, direction);}return newBitmap;}private static Bitmap createBitmapForFotoMix(Bitmap first, Bitmap second, int direction) {if (first == null) {return null;}if (second == null) {return first;}int fw = first.getWidth();int fh = first.getHeight();int sw = second.getWidth();int sh = second.getHeight();Bitmap newBitmap = null;if (direction == LEFT) {newBitmap = Bitmap.createBitmap(fw + sw, fh > sh ? fh : sh, Config.ARGB_8888); Canvas canvas = new Canvas(newBitmap);canvas.drawBitmap(first, sw, 0, null);canvas.drawBitmap(second, 0, 0, null);} else if (direction == RIGHT) {newBitmap = Bitmap.createBitmap(fw + sw, fh > sh ? fh : sh, Config.ARGB_8888); Canvas canvas = new Canvas(newBitmap);canvas.drawBitmap(first, 0, 0, null);canvas.drawBitmap(second, fw, 0, null);} else if (direction == TOP) {newBitmap = Bitmap.createBitmap(sw > fw ? sw : fw, fh + sh, Config.ARGB_8888);Canvas canvas = new Canvas(newBitmap);canvas.drawBitmap(first, 0, sh, null);canvas.drawBitmap(second, 0, 0, null);} else if (direction == BOTTOM) {newBitmap = Bitmap.createBitmap(sw > fw ? sw : fw, fh + sh, Config.ARGB_8888);Canvas canvas = new Canvas(newBitmap);canvas.drawBitmap(first, 0, 0, null);canvas.drawBitmap(second, 0, fh, null);}return newBitmap;}/*** 将Bitmap转换成指定大小* @param bitmap* @param width* @param height* @return*/public static Bitmap createBitmapBySize(Bitmap bitmap,int width,int height){return Bitmap.createScaledBitmap(bitmap, width, height, true);}/*** Drawable 转Bitmap** @param drawable* @return*/public static Bitmap drawableToBitmapByBD(Drawable drawable) { BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable; return bitmapDrawable.getBitmap();}/*** Bitmap 转Drawable** @param bitmap* @return*/public static Drawable bitmapToDrawableByBD(Bitmap bitmap) { Drawable drawable = new BitmapDrawable(bitmap);return drawable;}/*** byte[] 转bitmap** @param b* @return*/public static Bitmap bytesToBimap(byte[] b) {if (b.length != 0) {return BitmapFactory.decodeByteArray(b, 0, b.length);} else {return null;}}/*** bitmap 转byte[]** @param bm* @return*/public static byte[] bitmapToBytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); press(pressFormat.PNG, 100, baos); return baos.toByteArray();}。
Android⾃定义ImageView实现⾃动放⼤缩⼩动画这篇讲的是如何⽣成⼀个⾃定义的ImageView,实现⾃动放⼤缩⼩动画。
为什么实现这个功能呢?因为我想在ViewPager实现图⽚放⼤缩⼩的动画,但是ViewPager⼏个页⾯的动画会⼀起动,⽽且放⼤全屏图⽚的话会相互覆盖,很诡异。
于是上⽹搜demo,⼀⽆所获。
迫于⽆奈。
废话不多说,直接贴代码。
1.配置⽂件直接添加当直接在布局⽂件中添加图⽚的话,可以在⾃定义View代码中⽤getDrawable()获取图⽚资源,然后通过DrawBitmap绘制图⽚。
通过不断绘制图⽚的位置,达到放⼤缩⼩的功能。
第⼀种情况实在XML布局⽂件中直接添加的:public class CoolImageView extends ImageView {private int mLeft = 0;private int mTop = 0;private Handler mHandler;private Bitmap bitmap;private Rect srcRect = new Rect();private Rect dstRect = new Rect();private int imgWidth;private int imgHeight;private boolean flag;private boolean istart;public CoolImageView(Context context) {super(context);}public CoolImageView(Context context, AttributeSet attrs) {super(context, attrs);setUp(context, attrs);}public CoolImageView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);setUp(context, attrs);}private void setUp(Context context, AttributeSet attrs) {mHandler = new MoveHandler();mHandler.sendEmptyMessageDelayed(1, 220L);istart = true;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);int width = getWidth();int height = getHeight();//获取图⽚资源BitmapDrawable drawable = (BitmapDrawable) getDrawable();bitmap = drawable.getBitmap();dstRect.left = 0;dstRect.top = 0;dstRect.right = width;dstRect.bottom = height;if (bitmap != null) {if (istart) {// 获取图⽚的宽⾼imgWidth = bitmap.getWidth();imgHeight = bitmap.getHeight();srcRect.left = 0 + mLeft;srcRect.right = imgWidth - mLeft;srcRect.top = 0 + mTop;srcRect.bottom = imgHeight - mTop;canvas.drawBitmap(bitmap, srcRect, dstRect, null);} else {canvas.drawBitmap(bitmap, null, dstRect, null);}}}private class MoveHandler extends Handler {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case 1:if (imgHeight != 0) {if (mTop == 0) {mTop += 5;mLeft += 5;} else if (mTop == 120) {mTop -= 5;mLeft -= 5;}}postInvalidate();mHandler.sendEmptyMessageDelayed(1, 250);break;}}}public void start() {mTop = 0;mLeft = 0;istart = true;mHandler.sendEmptyMessageDelayed(1, 220L);}public void stop() {istart = false;}}2 .通过Glide加载图⽚的⽅式通过Glide加载图⽚的话,不能直接⽤getDrawable获取图⽚资源。
Android设置ImageView宽度固定,其⾼度按⽐例缩放适应今天和项⽬经理对喷了⼀下,他说在应⽤的列表数据中的图⽚应该宽度固定,⾼度按⽐例缩放⾃适应,我说,那岂不是很丑!直接让运营那边把图⽚处理成固定宽⾼⽐不就好了,省的我客户端⿇烦了。
这家伙不同意,为⽑呢,因为我们公司的图⽚尼玛全部是从别的⽹站上荡过来的,⼏万张图⽚,本⾝不知道图⽚宽度和⾼度。
我⽇。
好吧,既然提出了这么个需求,那我就实现呗,丑不丑就我就不管了。
我在群⾥问了些⼈有⽊有相关的实现,可惜没⼈鸟我,不知道是不是我问的太简单了还是没⼈会。
于是乎⽹上搜了些相关的实现⽅式,还真让我找到不少相关的东东,遂逐⼀验证。
有篇博客,名字是《》,乍眼⼀看,这不是正是我要的么,因为我项⽬正式采⽤了异步图⽚加载库Android-Universal-Image-Loader,可是我⼀尝试,没效果,我就呵呵呵了。
最后,我选择了另⼀个⽅案,结合⾃⼰的应⽤,做了些微的修改,效果还不错,值得记录⼀番:⾸先,定义ImageView,在该ImageView中,我们需要设置属性android:adjustViewBounds="true",他的意思图⽚是否保持宽⾼⽐。
切记的⼀点是该属性需要与maxWidth、MaxHeight⼀起使⽤,否则单独使⽤没有效果。
[html]1. <ImageView2. android:id="@+id/img_list"3. android:layout_width="fill_parent"4. android:layout_height="wrap_content"5. android:scaleType="centerCrop"6. android:adjustViewBounds="true"7. android:src="@drawable/load_default_img" />刚刚说了,android:adjustViewBounds="true"必须与MaxHeight⼀起使⽤才能有效,所以,我要设置该ImageView的最⼤⾼度MaxHeight:[html]1. int screenWidth = getScreenWidth(this); // 获取屏幕宽度2. youtParams lp = testImage.getLayoutParams();3. lp.width = screenWidth;4. lp.height = LayoutParams.WRAP_CONTENT;5. testImage.setLayoutParams(lp);6.7. testImage.setMaxWidth(screenWidth);8. testImage.setMaxHeight(screenWidth * 5); //这⾥其实可以根据需求⽽定,我这⾥测试为最⼤宽度的5倍以上是关键代码,在我的项⽬⾥,主要是结合Adapter使⽤的,请看代码:[java]1. import java.util.List;2.3. import android.app.Activity;4. import android.util.DisplayMetrics;5. import youtInflater;6. import android.view.View;7. import android.view.ViewGroup;8. import android.widget.BaseAdapter;9. import android.widget.ImageView;10.11. public class ImgsAdapter extends BaseAdapter {12.13. private Activity mContext;14.15. private LayoutInflater mInflater;16.17. private List<String> mDatas;18.19. private int width;20.21. public ImgsAdapter(Activity context, List<String> datas) {22. mContext = context;23. mInflater = LayoutInflater.from(mContext);24. mDatas = datas;25.26. DisplayMetrics dm = new DisplayMetrics();27. context.getWindowManager().getDefaultDisplay().getMetrics(dm);28.29. width = dm.widthPixels;30. }31.32. public void changeData(List<String> datas) {33. mDatas = datas;34. }35.36. public void addData(List<String> datas) {37. if (mDatas != null) {38. mDatas.addAll(datas);39. } else {40. changeData(datas);41. }42. }43.44. @Override45. public int getCount() {46. return (mDatas != null ? mDatas.size() : 0);47. }48.49. @Override50. public Object getItem(int position) {51. return (mDatas != null ? mDatas.get(position) : null);52. }53.54. @Override55. public long getItemId(int position) {56. return position;57. }58.59. @Override60. public View getView(final int position, View convertView, ViewGroup parent) {61. ViewHolder holder = null;62. int type = getItemViewType(position);63. if (convertView == null) {64. // 下拉项布局65. convertView = mInflater.inflate(yout.list_item_img, null);66.67. holder = new ViewHolder();68.69. holder.img_list = (ImageView) convertView.findViewById(R.id.img_list);70.71. int screenWidth = width;72.73. youtParams lp = holder.img_list.getLayoutParams();74. lp.width = screenWidth;75. lp.height = youtParams.WRAP_CONTENT;76.77. holder.img_list.setLayoutParams(lp);78.79. holder.img_list.setMaxWidth(screenWidth);80. holder.img_list.setMaxHeight((int) (screenWidth * 5));// 这⾥其实可以根据需求⽽定,我这⾥测试为最⼤宽度的1.5倍81.82. convertView.setTag(holder);83.84. } else {85. holder = (ViewHolder) convertView.getTag();86. }87.88. String imgUrl = mDatas.get(position);89. System.out.println(imgUrl);90.91. ImageLoaderUtil.getInstance().displayListItemImage(imgUrl, holder.img_list);92.93. return convertView;94. }95.96. class ViewHolder {97.98. ImageView img_list;99. }100. }好啦,稍微看下效果:以上就是宽度固定,⾼度按⽐例缩放的实现⽅式,本⾝并不难,记住使⽤⽅法就好了!版权声明:本⽂为博主原创⽂章,未经博主允许不得转载。
/** * 图片浏览、缩放、拖动、自动居中*/ public class ImageTouch extends Activity implements OnTouchListener {Matrix matrix = new Matrix();Matrix savedMatrix = new Matrix();DisplayMetrics dm;ImageView imgView;Bitmap bitmap;float minScaleR;// 最小缩放比例static final float MAX_SCALE = 4f;// 最大缩放比例static final int NONE = 0;// 初始状态static final int DRAG = 1;// 拖动static final int ZOOM = 2;// 缩放int mode = NONE;PointF prev = new PointF();PointF mid = new PointF();float dist = 1f;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);imgView = (ImageView) findViewById(R.id.imag);// 获取控件// bitmap = BitmapFactory.decodeResource(getResources(),// this.getIntent()// .getExtras().getInt("IMG"));// 获取图片资源bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);// 获取图片资源imgView.setImageBitmap(bitmap);// 填充控件imgView.setOnTouchListener(this);// 设置触屏监听dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);// 获取分辨率minZoom();center();imgView.setImageMatrix(matrix);}/** * 触屏监听*/public boolean onTouch(View v, MotionEvent event) {switch (event.getAction() & MotionEvent.ACTION_MASK) { // 主点按下case MotionEvent.ACTION_DOWN:savedMatrix.set(matrix);prev.set(event.getX(), event.getY());mode = DRAG;break; // 副点按下case MotionEvent.ACTION_POINTER_DOWN:dist = spacing(event); // 如果连续两点距离大于10,则判定为多点模式if (spacing(event) > 10f) {savedMatrix.set(matrix);midPoint(mid, event);mode = ZOOM;}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_POINTER_UP:mode = NONE;break;case MotionEvent.ACTION_MOVE:if (mode == DRAG) {matrix.set(savedMatrix);matrix.postTranslate(event.getX() - prev.x, event.getY()- prev.y);} else if (mode == ZOOM) {float newDist = spacing(event);if (newDist > 10f) {matrix.set(savedMatrix);float tScale = newDist / dist;matrix.postScale(tScale, tScale, mid.x, mid.y);}}break;}imgView.setImageMatrix(matrix);CheckView();return true;}/** * 限制最大最小缩放比例,自动居中*/private void CheckView() {float p[] = new float[9];matrix.getValues(p);if (mode == ZOOM) {if (p[0] < minScaleR) {matrix.setScale(minScaleR, minScaleR);}if (p[0] > MAX_SCALE) {matrix.set(savedMatrix);}}center();}/** * 最小缩放比例,最大为100% */private void minZoom() {minScaleR = Math.min((float) dm.widthPixels / (float) bitmap.getWidth(),(float) dm.heightPixels / (float) bitmap.getHeight());if (minScaleR < 1.0) {matrix.postScale(minScaleR, minScaleR);}}private void center() {center(true, true);}/** * 横向、纵向居中*/protected void center(boolean horizontal, boolean vertical) {Matrix m = new Matrix();m.set(matrix);RectF rect = new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight());m.mapRect(rect);float height = rect.height();float width = rect.width();float deltaX = 0, deltaY = 0;if (vertical) {// 图片小于屏幕大小,则居中显示。
Android多点触控技术实战,自由地对图片进行缩放和移动在Android瀑布流照片墙的效果这篇文章中,虽然这种效果很炫很酷,但其实还只能算是一个半成品,因为照片墙中所有的图片都是只能看不能点的。
因此本篇文章中,我们就来对这一功能进行完善,加入点击图片就能浏览大图的功能,并且在浏览大图的时候还可以通过多点触控的方式对图片进行缩放。
我们现在就开始动手吧,首先打开上次的PhotoWallFallsDemo项目,在里面加入一个ZoomImageView类,这个类就是用于进行大图展示和多点触控缩放的,代码如下所示:[java] view plain copypublic class ZoomImageView extends View {/*** 初始化状态常量*/public static final int STATUS_INIT = 1;/*** 图片放大状态常量*/public static final int STATUS_ZOOM_OUT = 2;/*** 图片缩小状态常量*/public static final int STATUS_ZOOM_IN = 3;/*** 图片拖动状态常量*/public static final int STATUS_MOVE = 4;/*** 用于对图片进行移动和缩放变换的矩阵*/private Matrix matrix = new Matrix();/*** 待展示的Bitmap对象*/private Bitmap sourceBitmap;/*** 记录当前操作的状态,可选值为STATUS_INIT、STATUS_ZOOM_OUT、STA TUS_ZOOM_IN和STATUS_MOVE*/private int currentStatus;/*** ZoomImageView控件的宽度*/private int width;/*** ZoomImageView控件的高度*/private int height;/*** 记录两指同时放在屏幕上时,中心点的横坐标值*/private float centerPointX;/*** 记录两指同时放在屏幕上时,中心点的纵坐标值*/private float centerPointY;/*** 记录当前图片的宽度,图片被缩放时,这个值会一起变动*/private float currentBitmapWidth;/*** 记录当前图片的高度,图片被缩放时,这个值会一起变动*/private float currentBitmapHeight;/*** 记录上次手指移动时的横坐标*/private float lastXMove = -1;/*** 记录上次手指移动时的纵坐标*/private float lastYMove = -1;/*** 记录手指在横坐标方向上的移动距离*/private float movedDistanceX;/*** 记录手指在纵坐标方向上的移动距离*/private float movedDistanceY;/*** 记录图片在矩阵上的横向偏移值*/private float totalTranslateX;/*** 记录图片在矩阵上的纵向偏移值*/private float totalTranslateY;/*** 记录图片在矩阵上的总缩放比例*/private float totalRatio;/*** 记录手指移动的距离所造成的缩放比例*/private float scaledRatio;/*** 记录图片初始化时的缩放比例*/private float initRatio;/*** 记录上次两指之间的距离*/private double lastFingerDis;/*** ZoomImageView构造函数,将当前操作状态设为STATUS_INIT。
Android应用中实现手势控制图片缩放的完全攻略这篇文章主要介绍了Android应用中实现手势控制图片缩放的完全攻略,采用了Matrix矩阵的方法,实例讲解了包括触摸点设置与各种冲突的处理等方面,相当全面,需要的朋友可以参考下一、概述现在app中,图片预览功能肯定是少不了的,用户基本已经形成条件反射,看到小图,点击看大图,看到大图两个手指开始进行放大,放大后,开始移动到指定部位~~~我相信看图的整个步骤,大家或者说用户应该不希望被打断把~~~“我擦,竟然不能放大,什么玩意,卸了~~“,"我擦,竟然不能移动,留有何用,卸了~~"。
哈~所以对于图片的预览,一来,我们要让用户爽;二来,我们作为开发者,也得知道如何实现~~~想要做到图片支持多点触控,自由的进行缩放、平移,需要了解几个知识点:Matrix , GestureDetector , ScaleGestureDetector 以及事件分发机制,ps:不会咋办,不会你懂的。
二、Matrix矩阵,看深入了都是3维矩阵的乘啊什么的,怪麻烦的~~其实这么了解下就行了:Matrix数据结构:3维矩阵;内部存储:new Float[9] ; 内部就是个一维数组,内部9个元素;可以进行setValues(float[] values)进行初始化每个元素代表的意思:{ MSCALE_X, MSKEW_X, MTRANS_X, MSKEW_Y, MSCALE_Y, MTRANS_Y, MPERSP_0, MPERSP_1, MPERSP_2 };字面上,应该能看出来哪个代表x方向缩放,哪个代表垂直方向的偏移量吧~~有不认识的3个,没事,请无视。
操作比如你想要设置matrix的偏移量为200,100你可以这么写:Matrix transMatrix = new Matrix(); float[] values = new float[] { 1.0, 0, 200, 0, 1.0, 100, 0, 0, 1.0 }; transMatrix.setValues(values);如果需要在旋转30度,放大两倍~~这么写其实怪麻烦的~~Matrix提供了一些常用的API:例如我们可以这么写:Matrix transMatrix = new Matrix(); transMatrix.postTranslate(200, 100);如何获取值:当然了,我们对一个Matrix进行了各种操作,一会postScale,一会postTranslate;那么现在如何获得当前的缩放比例:前面说setValues可以初始化,那么getValues就能拿到当前矩阵的值,拿到的是个一维数组,9个元素;再通过下标取对应值就可以。
android自定义ImageView实现缩放,回弹效果androidImageview缩放回弹话不多说上代码:MainActivity.javapublic class MainActivity extends Activity{private LinearLayout ll_viewArea;private youtParams parm;private ViewArea viewArea;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//去除titlerequestWindowFeature(Window.FEATURE_NO_TITLE);//去掉Activity上面的状态栏getWindow().setFlags(youtParams.FLAG_FULLSCREEN,youtParams. FLAG_FULLSCREEN);setContentView(yout.main);ll_viewArea = (LinearLayout) findViewById(R.id.ll_viewArea); parm = newyoutParams(youtParams.FILL_PARENT, youtParams.FILL_PARENT);viewArea = newViewArea(MainActivity.this,R.drawable.psu); //自定义布局控件,用来初始化并存放自定义imageViewll_viewArea.addView(viewArea,parm);}}这段代码中要注意的问题是去掉title和状态栏两句代码必须放到setContentView(yout.main);话的前面。
而且这两句话必须有,因为后面计算回弹距离是根据全屏计算的(我的i9000就是480x800),如果不去掉title 和状态栏,后面的回弹会有误差,总是回弹不到想要的位置。
方法1:按固定比例进行缩放在开发图片浏览器等软件是,很多时候要显示图片的缩略图,而一般情况下,我们要将图片按照固定大小取缩略图,一般取缩略图的方法是使用BitmapFactory的decodeFile方法,然后通过传递进去BitmapFactory.Option类型的参数进行取缩略图,在Option中,属性值inSampleSize表示缩略图大小为原始图片大小的几分之一,即如果这个值为2,则取出的缩略图的宽和高都是原始图片的1/2,图片大小就为原始大小的1/4。
然而,如果我们想取固定大小的缩略图就比较困难了,比如,我们想将不同大小的图片去出来的缩略图高度都为200px,而且要保证图片不失真,那怎么办?我们总不能将原始图片加载到内存中再进行缩放处理吧,要知道在移动开发中,内存是相当宝贵的,而且一张100K的图片,加载完所占用的内存何止100K?经过研究,发现,Options中有个属性inJustDecodeBounds,研究了一下,终于明白是什么意思了,SDK中的E文是这么说的If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.意思就是说如果该值设为true那么将不返回实际的bitmap不给其分配内存空间而里面只包括一些解码边界信息即图片大小信息,那么相应的方法也就出来了,通过设置inJustDecodeBounds为true,获取到outHeight(图片原始高度)和outWidth(图片的原始宽度),然后计算一个inSampleSize(缩放值),然后就可以取图片了,这里要注意的是,inSampleSize可能小于0,必须做判断。