图片缩放,可裁剪的封装类
来源:互联网 发布:在线客服js懒人之家 编辑:程序博客网 时间:2024/05/22 11:28
package com.example.administrator.text.widget;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.PointF;import android.graphics.RectF;import android.graphics.drawable.BitmapDrawable;import android.media.ThumbnailUtils;import android.os.Environment;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import java.io.File;import java.io.FileOutputStream;import java.util.Timer;import java.util.TimerTask;/** * Created by Administrator on 2016/9/28. */public class ScaleImageView extends android.support.v7.widget.AppCompatImageView { public static final int SCALE = 2; public static final int DRAG = 1; public static final int NONE = 0; public int mode = NONE; //缩放比率 public static final float MAX = 3f; public static final int MIN = 1; Bitmap bmp; //屏幕宽度 int width; // PointF moveFinger = new PointF(); PointF scaleCenter = new PointF(); Matrix martix; float twoDis = 0; //画笔 Paint paint; //java代码创建 public ScaleImageView(Context context) { super(context); init(); } //xml中创建 public ScaleImageView(Context context, AttributeSet attrs) { super(context, attrs); init(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, widthMeasureSpec); } public void init() { setBackgroundColor(Color.rgb(0x31, 0x33, 0x35)); //很重要的方法 setScaleType(ScaleType.MATRIX); width = getResources().getDisplayMetrics().widthPixels; //设置画笔 paint = new Paint(); paint.setAntiAlias(true); paint.setDither(true); paint.setColor(Color.argb(0x80, 0XFF, 0XFF, 0XFF)); paint.setStrokeWidth(2); } boolean isShowLine = false; @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint.setARGB(0X80, 0XFF, 0XFF, 0XFF); if (isShowLine) { for (int i = 0; i < 2; i++) { canvas.drawLine(width / 3 * (i + 1), 0, width / 3 * (i + 1), width, paint); canvas.drawLine(0, width / 3 * (i + 1), width, width / 3 * (i + 1), paint); } } } //获取图片 public String getScaleBitmap() { Bitmap bmp = Bitmap.createBitmap(width, width, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bmp); paint.setARGB(0xFF, 0XFF, 0XFF, 0XFF); canvas.drawBitmap(this.bmp, martix, paint); //上传 文件 String name = ""; try { name = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), System.currentTimeMillis() + ".png").getAbsolutePath(); FileOutputStream fio = new FileOutputStream(name); bmp.compress(Bitmap.CompressFormat.PNG, 100, fio); fio.flush(); fio.close(); } catch (Exception e) { e.printStackTrace(); } return name; /* //获取当前图片 //Bitmap src = ((BitmapDrawable) getDrawable()).getBitmap(); //获取图片的位置 RectF rectf = new RectF(0, 0, bmp.getWidth(), bmp.getHeight()); martix.mapRect(rectf); //最终的取的图片部分 Rect rectsrc = new Rect(-(int) rectf.left, - (int) rectf.top, -(int) rectf.left+width, - (int) rectf.top+width); Log.e("TAG", rectsrc.toString()); Log.e("TAG", "-----------" + (int) rectf.left + " " + (int) rectf.top + " " + (int) rectf.right + " " + (int) rectf.bottom); //目标的图片部分 Rect rectdst = new Rect(0, 0, width, width); canvas.drawBitmap(this.bmp, rectsrc, rectdst, paint); canvas.save(); // bmp.recycle(); try { bmp.compress(Bitmap.CompressFormat.PNG, 100, new FileOutputStream(Environment.getExternalStorageDirectory().getAbsolutePath() + "/temp.png")); } catch (FileNotFoundException e) { e.printStackTrace(); }*/ } //设置图片 @Override public void setImageBitmap(Bitmap bm) { if (bm == null) return; //图片矩阵运算 martix = new Matrix(); //放大到铺满全屏 //判断图片的高宽是否大于width if (bm.getWidth() < width || bm.getHeight() < width) { //取最小值 int min = Math.min(bm.getWidth(), bm.getHeight()); //放大多少呢? float rate = width * 1.0f / min; // 放大 this.bmp = ThumbnailUtils.extractThumbnail(bm, (int) (bm.getWidth() * rate), (int) (bm.getHeight() * rate)); } else this.bmp = bm; setImageMatrix(martix); super.setImageBitmap(bmp); } Timer timer; @Override public boolean onTouchEvent(MotionEvent event) { isShowLine = true; if (timer != null) timer.cancel(); //如果需要拿多指触碰 switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: //按下的时候,记住你的手指头 moveFinger.set(event.getX(), event.getY()); mode = DRAG; break; case MotionEvent.ACTION_POINTER_DOWN: //记录放大的中心点 //设置中心店 scaleCenter = centerPoint(event); mode = SCALE; twoDis = twoMove(event); break; case MotionEvent.ACTION_UP: mode = NONE; //位置复位 reSet(); //关闭线条 timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { isShowLine = false; //子线程重绘 postInvalidate(); } }, 1000); break; case MotionEvent.ACTION_POINTER_UP: mode = DRAG; //缩放复位 reScaleSet(); break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { //拖拽 PointF pointf = calcDistance(event); //x y 移动的距离 martix.postTranslate(pointf.x, pointf.y); //记录移动后的点 moveFinger.set(event.getX(), event.getY()); } else if (mode == SCALE) { //当前的距离 float dis = twoMove(event) / twoDis; martix.postScale(dis, dis, scaleCenter.x, scaleCenter.y); } break; } setImageMatrix(martix); return true; } private void reScaleSet() { float values[] = new float[9]; martix.getValues(values); Log.e("TAG", "------缩放" + values[0]); if (values[0] < MIN) { values[0] = MIN; values[4] = MIN; } if (values[0] > MAX) { values[0] = MAX; values[4] = MAX; } martix.setValues(values); Bitmap src = ((BitmapDrawable) getDrawable()).getBitmap(); Log.e("TAG", src.getWidth() + " " + src.getHeight()); } //复位 public void reSet() { RectF rectf = new RectF(0, 0, bmp.getWidth(), bmp.getHeight()); //计算当前图片在矩阵的位置 martix.mapRect(rectf); Log.e("TAG", rectf.left + " " + rectf.right + " " + rectf.top + " " + rectf.bottom); float x = 0; float y = 0; //水平方向 if (rectf.left > 0) { x = -rectf.left; } else if (rectf.right < width) { x = width - rectf.right; } //垂直方向 if (rectf.top > 0) y = -rectf.top; else if (rectf.bottom < width) y = width - rectf.bottom; martix.postTranslate(x, y); } //计算两点之间的距离 public PointF calcDistance(MotionEvent event) { float x = event.getX(); float y = event.getY(); PointF pointf = new PointF(x - moveFinger.x, y - moveFinger.y); return pointf; } public PointF centerPoint(MotionEvent event) { float x = event.getX(0) + event.getX(1); float y = event.getY(0) + event.getY(1); return new PointF(x / 2, y / 2); } //两点移动距离 public float twoMove(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return x * x + y * y; } @Override public boolean dispatchTouchEvent(MotionEvent event) { getParent().requestDisallowInterceptTouchEvent(true); return super.dispatchTouchEvent(event); }}用法:
1.复制代码到工程目录下
2.xml中直接加入下面代码就好
<com.example.administrator.text.widget.ScaleImageView android:id="@+id/siv_img" android:layout_width="match_parent" android:layout_height="wrap_content" />3.
阅读全文
0 0
- 图片缩放,可裁剪的封装类
- php+croppic 图片裁剪,可缩放、旋转
- 用1000行代码写出android的图片裁剪控件 - 裁剪框固定,图片可拖动、缩放,支持双击缩放、惯性滑动
- nginx实现图片的缩放和裁剪
- java实现图片裁剪缩放工具类
- 图片缩放裁剪
- iOS 图片裁剪 缩放
- 图片缩放裁剪
- nginx-图片裁剪缩放
- java 图片缩放、裁剪。
- surfaceview缩放裁剪图片
- 图片裁剪/旋转/缩放
- TKImageView-可定制样式的图片裁剪工具类
- 对图片裁剪框架 ucrop 的二次封装的工具类,添加从图库选择和拍照获取图片,项目中可直接使用,十分便捷
- 截屏,裁剪图片,缩放图片
- 黄聪:C#图片处理封装类(裁剪、缩放、清晰度、加水印、生成缩略图)有示例(转)
- 基于Flex的裁剪图片功能封装
- 基于Flex的裁剪图片功能封装
- 算法谜题44 孰轻孰重
- 软考复习(软件设计师)
- linux系统getopt函数详解
- Repository模式--采用EF Fluent API使用EntityTypeConfiguration分文件配置Model映射关系
- linux ssh会话克隆
- 图片缩放,可裁剪的封装类
- Java中i++和++i的区别
- 多线程基础知识及Handler机制(1)
- Linux 学习笔记(三)
- jqery和js如何判断checkbox是否选中
- 插值拟合
- http协议及状态码
- 如何创建,授权,并访问资产管理服务(Asset Service)
- 全排列