android双指平移、旋转、缩放控件完美版

package com.example.zhouqiong.richeditotandroid.edit;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.PointF;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.Scroller;

import com.blankj.utilcode.util.ToastUtils;
import com.example.zhouqiong.richeditotandroid.view.CustomsEditText;
import com.example.zhouqiong.richeditotandroid.xzhucourseware.R;
import com.example.zhouqiong.richeditotandroid.xzhucourseware.model.bean.BubbleInfo;
import com.example.zhouqiong.richeditotandroid.xzhucourseware.util.LogUtil;

/**
 * Created by Robert on 2017/6/20.
 */

public class MoveLayout extends RelativeLayout {

    private boolean isBorder = true;

    private int dragDirection = 0;
    private static final int TOP = 0x15;
    private static final int LEFT = 0x16;
    private static final int BOTTOM = 0x17;
    private static final int RIGHT = 0x18;
    private static final int LEFT_TOP = 0x11;
    private static final int RIGHT_TOP = 0x12;
    private static final int LEFT_BOTTOM = 0x13;
    private static final int RIGHT_BOTTOM = 0x14;
    private static final int CENTER = 0x19;


    private int lastX;
    private int lastY;

    private int screenWidth;
    private int screenHeight;

    private int oriLeft;
    private int oriRight;
    private int oriTop;
    private int oriBottom;


    /**
     * 标示此类的每个实例的id
     */
    private int identity = 0;

    /**
     * 保存此布局所显示的Image的本地路径
     */
    private String imgLocalPath;
    /**
     * 保存此布局所显示的Image的服务器地址
     */
    private String imgUrlPath;

    /**
     * 保存此布局锁展示的图标id
     */
    private int imgLocalId;
    private String imgLogcalBitmap;
    /**
     * 图片类型(图片或图标)
     */
    private int imgType;

    /**
     * 保存气泡内边距 及背景图片本地路径
     */
    private BubbleInfo bubbleInfo;
    private String editBg;

    /**
     * 触控区域设定
     */
    private int touchAreaLength = 60;

    private int minHeight = 120;
    private int minWidth = 180;
    private static final String TAG = "MoveLinearLayout";

    private Paint mBorderPaint;

    private float ratio = DEFAULT_RATIO;
    public final static float DEFAULT_RATIO = 1f;

    private boolean isBubble = false;
    private int oriWidth, oriHeight;
    private CustomsEditText customsEditText;

//    private boolean isTopLimit = false;
//    private boolean isBottomLimit = false;


    public MoveLayout(Context context, float ratio) {
        super(context);
        this.ratio = ratio;
        init(context);
    }

    public MoveLayout(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public MoveLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);

    }

    private void init(Context context) {
        mBorderPaint = new Paint();
        mBorderPaint.setColor(Color.RED);
        mBorderPaint.setStrokeWidth(5.0f);
        mBorderPaint.setAntiAlias(true);
        mBorderPaint.setStyle(Paint.Style.STROKE);

        screenHeight = 500;//getResources().getDisplayMetrics().heightPixels - 40;
        screenWidth = 500;// getResources().getDisplayMetrics().widthPixels;

    }

    public void setViewWidthHeight(int width, int height) {
        screenWidth = width;
        screenHeight = height;
    }

    public void setMinHeight(int height) {
        minHeight = height;
        if (minHeight < touchAreaLength * 2) {
            minHeight = touchAreaLength * 2;
        }
    }

    public void setMinWidth(int width) {
        minWidth = width;
        if (minWidth < touchAreaLength * 3) {
            minWidth = touchAreaLength * 3;
        }
    }

    public String getImgUrlPath() {
        return imgUrlPath;
    }

    public void setImgUrlPath(String imgUrlPath) {
        this.imgUrlPath = imgUrlPath;
    }

    public BubbleInfo getBubbleInfo() {
        return bubbleInfo;
    }

    public void setBubbleInfo(BubbleInfo bubbleInfo) {
        this.bubbleInfo = bubbleInfo;
    }

    public String getEditBg() {
        return editBg;
    }

    public void setEditBg(String editBg) {
        this.editBg = editBg;
    }

    public boolean isBorder() {
        return isBorder;
    }

    public void setBorder(boolean border) {
        isBorder = border;
    }

    private int mDeleteHeight = 0;
    private int mDeleteWidth = 0;
    private boolean isInDeleteArea = false;

    public void setDeleteWidthHeight(int width, int height) {
        mDeleteWidth = screenWidth - width;
        mDeleteHeight = height;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }

    private boolean isImage = false;
    // 属性变量
    private float translationX; // 移动X
    private float translationY; // 移动Y
    private float scale = 1; // 伸缩比例
    private float rotation; // 旋转角度

    // 移动过程中临时变量
    private float actionX;
    private float actionY;
    private float spacing;
    private float degree;
    private int moveType; // 0=未选择,1=拖动,2=缩放

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                mOnTouchListener.onTouch(this);
                moveType = 1;
                actionX = event.getRawX();
                actionY = event.getRawY();
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                moveType = 2;
                spacing = getSpacing(event);
                degree = getDegree(event);
                break;
            case MotionEvent.ACTION_MOVE:
                if (moveType == 1) {
                    translationX = translationX + event.getRawX() - actionX;
                    translationY = translationY + event.getRawY() - actionY;
                    setTranslationX(translationX);
                    setTranslationY(translationY);
                    actionX = event.getRawX();
                    actionY = event.getRawY();
                } else if (moveType == 2) {
                    scale = scale * getSpacing(event) / spacing;
                    setScaleX(scale);
                    setScaleY(scale);
                    rotation = rotation + getDegree(event) - degree;
                    if (rotation > 360) {
                        rotation = rotation - 360;
                    }
                    if (rotation < -360) {
                        rotation = rotation + 360;
                    }
                    setRotation(rotation);
                }
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
                moveType = 0;
        }
        return true;
    }

    // 触碰两点间距离
    private float getSpacing(MotionEvent event) {
        //通过三角函数得到两点间的距离
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return (float) Math.sqrt(x * x + y * y);
    }

    // 取旋转角度
    private float getDegree(MotionEvent event) {
        //得到两个手指间的旋转角度
        double delta_x = event.getX(0) - event.getX(1);
        double delta_y = event.getY(0) - event.getY(1);
        double radians = Math.atan2(delta_y, delta_x);
        return (float) Math.toDegrees(radians);
    }

    public int getImgType() {
        return imgType;
    }

    public void setImgType(int imgType) {
        this.imgType = imgType;
    }

    public int getImgLocalId() {
        return imgLocalId;
    }

    public void setImgLocalId(int imgLocalId) {
        this.imgLocalId = imgLocalId;
    }

    public int getIdentity() {
        return identity;
    }

    public void setIdentity(int identity) {
        this.identity = identity;
    }

    public String getImgLocalPath() {
        return imgLocalPath;
    }

    public void setImgLocalPath(String imgLocalPath) {
        this.imgLocalPath = imgLocalPath;
    }

    private OnTouchListener mOnTouchListener;

    protected interface OnTouchListener {
        void onTouch(View view);
    }

    public void setOnTouchListener(OnTouchListener mOnTouchListener) {
        this.mOnTouchListener = mOnTouchListener;
    }

    public boolean isBubble() {
        return isBubble;
    }

    public void setBubble(boolean bubble) {
        isBubble = bubble;
    }

    public int getOriWidth() {
        return oriWidth;
    }

    public void setOriWidth(int oriWidth) {
        this.oriWidth = oriWidth;
    }

    public int getOriHeight() {
        return oriHeight;
    }

    public void setOriHeight(int oriHeight) {
        this.oriHeight = oriHeight;
    }

    public CustomsEditText getCustomsEditText() {
        return customsEditText;
    }

    public void setCustomsEditText(CustomsEditText customsEditText) {
        this.customsEditText = customsEditText;
    }

    public String getImgLogcalBitmap() {
        return imgLogcalBitmap;
    }

    public void setImgLogcalBitmap(String imgLogcalBitmap) {
        this.imgLogcalBitmap = imgLogcalBitmap;
    }
}

转载自:https://www.jianshu.com/p/df34e47bfa2a

你可能感兴趣的:(android常用记录)