图片缩放,可裁剪的封装类

来源:互联网 发布:在线客服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.

原创粉丝点击