设为首页 加入收藏

TOP

Android 自定义控件——图片剪裁(一)
2015-02-02 14:32:00 来源: 作者: 【 】 浏览:52
Tags:Android 定义 控件 图片 剪裁

如图:


Android 自定义控件——图片剪裁


CropImageView.java


该类继承View


功能:在onDraw方法中画图片、浮层,处理touch事件,最后根据坐标对图片进行剪裁。


public class CropImageView extends View {
?// 在touch重要用到的点,
?private float mX_1 = 0;
?private float mY_1 = 0;
?// 触摸事件判断
?private final int STATUS_SINGLE = 1;
?private final int STATUS_MULTI_START = 2;
?private final int STATUS_MULTI_TOUCHING = 3;
?// 当前状态
?private int mStatus = STATUS_SINGLE;
?// 默认裁剪的宽高
?private int cropWidth;
?private int cropHeight;
?// 浮层Drawable的四个点
?private final int EDGE_LT = 1;
?private final int EDGE_RT = 2;
?private final int EDGE_LB = 3;
?private final int EDGE_RB = 4;
?private final int EDGE_MOVE_IN = 5;
?private final int EDGE_MOVE_OUT = 6;
?private final int EDGE_NONE = 7;


?public int currentEdge = EDGE_NONE;


?protected float oriRationWH = 0;
?protected final float maxZoomOut = 5.0f;
?protected final float minZoomIn = 0.333333f;


?protected Drawable mDrawable;
?protected FloatDrawable mFloatDrawable;


?protected Rect mDrawableSrc = new Rect();// 图片Rect变换时的Rect
?protected Rect mDrawableDst = new Rect();// 图片Rect
?protected Rect mDrawableFloat = new Rect();// 浮层的Rect
?protected boolean isFrist = true;
?private boolean isTouchInSquare = true;


?protected Context mContext;


?public CropImageView(Context context) {
? super(context);
? init(context);
?}


?public CropImageView(Context context, AttributeSet attrs) {
? super(context, attrs);
? init(context);
?}


?public CropImageView(Context context, AttributeSet attrs, int defStyle) {
? super(context, attrs, defStyle);
? init(context);


?}


?@SuppressLint("NewApi")
?private void init(Context context) {
? this.mContext = context;
? try {
? ?if (android.os.Build.VERSION.SDK_INT >= 11) {
? ? this.setLayerType(LAYER_TYPE_SOFTWARE, null);
? ?}
? } catch (Exception e) {
? ?e.printStackTrace();
? }
? mFloatDrawable = new FloatDrawable(context);
?}


?public void setDrawable(Drawable mDrawable, int cropWidth, int cropHeight) {
? this.mDrawable = mDrawable;
? this.cropWidth = cropWidth;
? this.cropHeight = cropHeight;
? this.isFrist = true;
? invalidate();
?}


?@SuppressLint("ClickableViewAccessibility")
?@Override
?public boolean onTouchEvent(MotionEvent event) {


? if (event.getPointerCount() > 1) {
? ?if (mStatus == STATUS_SINGLE) {
? ? mStatus = STATUS_MULTI_START;
? ?} else if (mStatus == STATUS_MULTI_START) {
? ? mStatus = STATUS_MULTI_TOUCHING;
? ?}
? } else {
? ?if (mStatus == STATUS_MULTI_START
? ? ?|| mStatus == STATUS_MULTI_TOUCHING) {
? ? mX_1 = event.getX();
? ? mY_1 = event.getY();
? ?}


? ?mStatus = STATUS_SINGLE;
? }


? switch (event.getAction()) {
? case MotionEvent.ACTION_DOWN:
? ?mX_1 = event.getX();
? ?mY_1 = event.getY();
? ?currentEdge = getTouch((int) mX_1, (int) mY_1);
? ?isTouchInSquare = mDrawableFloat.contains((int) event.getX(),
? ? ?(int) event.getY());


? ?break;


? case MotionEvent.ACTION_UP:
? ?checkBounds();
? ?break;


? case MotionEvent.ACTION_POINTER_UP:
? ?currentEdge = EDGE_NONE;
? ?break;


? case MotionEvent.ACTION_MOVE:
? ?if (mStatus == STATUS_MULTI_TOUCHING) {


? ?} else if (mStatus == STATUS_SINGLE) {
? ? int dx = (int) (event.getX() - mX_1);
? ? int dy = (int) (event.getY() - mY_1);


? ? mX_1 = event.getX();
? ? mY_1 = event.getY();
? ? // 根據得到的那一个角,并且变换Rect
? ? if (!(dx == 0 && dy == 0)) {
? ? ?switch (currentEdge) {
? ? ?case EDGE_LT:
? ? ? mDrawableFloat.set(mDrawableFloat.left + dx,
? ? ? ? mDrawableFloat.top + dy, mDrawableFloat.right,
? ? ? ? mDrawableFloat.bottom);
? ? ? break;


? ? ?case EDGE_RT:
? ? ? mDrawableFloat.set(mDrawableFloat.left,
? ? ? ? mDrawableFl

首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android 图片拖拽、放大缩小的自.. 下一篇Android ContentObserver使用实现..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: