图片剪裁控件——ClipImageView

本文介绍了作者在项目中实现的图片剪裁控件ClipImageView的详细过程,包括控件继承ImageView并重写onDraw方法来绘制剪裁框和阴影,以及使用工具类ClipImageUtils进行剪裁操作。还提供了使用控件的便利性和效果图,鼓励读者留言交流。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这段时间在做自己的项目时,需要使用到图片剪裁功能,当时大概的思考了一些需求,想到了比较简单的实现方法,因此就抽了点时间做了这个图片剪裁控件——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
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值