这段时间在做自己的项目时,需要使用到图片剪裁功能,当时大概的思考了一些需求,想到了比较简单的实现方法,因此就抽了点时间做了这个图片剪裁控件——ClipImageView
这里先贴上ClipImageView的代码:
package com.example.clipimage;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
/**
* 图片剪裁控件; 注意事项: 1.在为ClipImageView设置图片时(调用setImageResource(),
* setImageDrawable(), setImageBitmap()),要注意图片的大小,即注意Bitmap可能导致 程序出现oom的问题。
* 2.如对剪裁图片质量无过高要求,建议调用setImageResourceSecure(), setImageDrawableSecure(),
* setImageBitmapSecure()设置图片。
*
* @author freeman.wu
*
*/
public class ClipImageView extends ImageView {
private float currX;
private float currY;
private float dX;
private float dY;
private float oldX;
private float oldY;
private int maxX;
private int maxY;
private final float density = getResources().getDisplayMetrics().density; // 密度
private float mClipFrameBorderWidth = 1 * density; // 剪裁框的边框宽度
private int mClipFrameWidth = 350; // 默认的剪裁框的宽度
private int mClipFrameHeight = 350; // 默认的剪裁框的高度
private int imWidth; // ClipImageView的宽度
private int imHeight; // ClipImageView的高度
private boolean showClipFrame = true; // 是否显示剪裁框
private String mClipFrameColor = "#FFFFFFFF"; // 剪裁框的边框颜色
private String mShadowColor = "#99000000"; // 阴影颜色
private Paint mShadowPaint;
private Paint mClipFramePaint;
/**
* 剪裁框外的阴影
*/
private Rect mRectLeftShadow;
private Rect mRectRightShadow;
private Rect mRectTopShadow;
private Rect mRectBottomShadow;
/**
* 剪裁框
*/
private Rect mClipFrame;
/**
* 设置在ImageView中的Bitmap
*/
private Bitmap source;
public ClipImageView(Context context, AttributeSet attrs) {
super(context, attrs);
setAdjustViewBounds(true);
initPaint();
initRect();
post(new Runnable() {
@Override
public void run() {
imWidth = getWidth();
imHeight = getHeight();
resolveClipFrameSize(); // 必要步骤,校正剪裁框大小,且必须在计算maxX和maxY之前
maxX = imWidth - mClipFrameWidth;
maxY = imHeight - mClipFrameHeight;
currX = (floa