我正在尝试编写一个项目。在我的项目中,我可以成功拖动图像。
This is the PICTURE,这是我的ViewOnTouchListener代码:

package com.seifi.dragtestapplication;
import android.graphics.Point;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;
class ViewOnTouchListener implements View.OnTouchListener {
    Point pushPoint, closePoint;
    int lastImgLeft;
    int lastImgTop;
    FrameLayout.LayoutParams viewLP;
    FrameLayout.LayoutParams pushBtnLP;
    FrameLayout.LayoutParams closeBtnLP;
    int lastPushBtnLeft, lastCloseBtnLeft;
    int lastPushBtnTop, lastCloseBtnTop;
    private View mPushView, mCloseView, mShadowView;

    ViewOnTouchListener(View mPushView, View mCloseView, View mShadowView) {
        this.mPushView = mPushView;
        this.mCloseView = mCloseView;
        this.mShadowView = mShadowView;
    }

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                if (null == viewLP) {
                    viewLP = (FrameLayout.LayoutParams) view.getLayoutParams();
                }
                if (null == pushBtnLP) {
                    pushBtnLP = (FrameLayout.LayoutParams) mPushView.getLayoutParams();
                }

                if (null == closeBtnLP) {
                    closeBtnLP = (FrameLayout.LayoutParams) mCloseView.getLayoutParams();
                }
                closePoint = getRawPoint(event);
                pushPoint = getRawPoint(event);
                lastImgLeft = viewLP.leftMargin;
                lastImgTop = viewLP.topMargin;
                lastPushBtnLeft = pushBtnLP.leftMargin;
                lastPushBtnTop = pushBtnLP.topMargin;

                lastCloseBtnLeft = closeBtnLP.leftMargin;
                lastCloseBtnTop = closeBtnLP.topMargin;
                (mShadowView).setBackgroundResource(R.drawable.my_shadow_pressed);
                break;
            case MotionEvent.ACTION_MOVE:
                Point newPoint = getRawPoint(event);
                float moveX = newPoint.x - pushPoint.x;
                float moveY = newPoint.y - pushPoint.y;

                viewLP.leftMargin = (int) (lastImgLeft + moveX);
                viewLP.topMargin = (int) (lastImgTop + moveY);
                view.setLayoutParams(viewLP);

                pushBtnLP.leftMargin = (int) (lastPushBtnLeft + moveX);
                pushBtnLP.topMargin = (int) (lastPushBtnTop + moveY);
                mPushView.setLayoutParams(pushBtnLP);

                closeBtnLP.leftMargin = (int) (lastCloseBtnLeft + moveX);
                closeBtnLP.topMargin = (int) (lastCloseBtnTop + moveY);
                mCloseView.setLayoutParams(closeBtnLP);

                break;
            case MotionEvent.ACTION_UP: {
                (mShadowView).setBackgroundResource(R.drawable.my_shadow);
                break;
            }
        }
        return false;
    }

    private Point getRawPoint(MotionEvent event) {
        return new Point((int) event.getRawX(), (int) event.getRawY());
    }
}


Look at the PICTURE please
这是我的DragView代码:

package com.seifi.dragtestapplication;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class DragView extends LinearLayout {
    private ImageView mView;
    private ImageView mPushView;
    private ImageView mCloseView;
    private View mShadowView;
    private float _1dp;
    private boolean mCenterInParent = true;
    private Drawable mImageDrawable, mPushImageDrawable, mCloseImageDrawable, mShadowImageDrawable;
    private float mImageHeight, mImageWidth, mPushImageHeight, mPushImageWidth, mCloseImageHeight, mCloseImageWidth, mShadowImageWidth, mShadowImageHeight;
    private int mLeft = 0, mTop = 0;


    public DragView(Context context) {
        this(context, null, 0);
    }

    public DragView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public DragView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this._1dp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, context.getResources().getDisplayMetrics());
        this.parseAttr(context, attrs);
        View mRoot = View.inflate(context, R.layout.drag_layout, null);
        addView(mRoot, -1, -1);
        mPushView = (ImageView) mRoot.findViewById(R.id.push_view);
        mView = (ImageView) mRoot.findViewById(R.id.view);
        mCloseView = (ImageView) mRoot.findViewById(R.id.close_view);
        mShadowView = (View)mRoot.findViewById(R.id.shadowView);
        mView.setOnTouchListener(new ViewOnTouchListener(mPushView, mCloseView, mShadowView));
    }



    private void parseAttr(Context context, AttributeSet attrs) {
        if (null == attrs) return;
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SingleFingerView);
        if (a != null) {
            int n = a.getIndexCount();
            for (int i = 0; i < n; i++) {
                int attr = a.getIndex(i);
                if (attr == R.styleable.SingleFingerView_centerInParent) {
                    this.mCenterInParent = a.getBoolean(attr, true);
                } else if (attr == R.styleable.SingleFingerView_image) {
                    this.mImageDrawable = a.getDrawable(attr);
                } else if (attr == R.styleable.SingleFingerView_image_height) {
                    this.mImageHeight = a.getDimension(attr, 200 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_image_width) {
                    this.mImageWidth = a.getDimension(attr, 200 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_push_image) {
                    this.mPushImageDrawable = a.getDrawable(attr);
                } else if (attr == R.styleable.SingleFingerView_push_image_width) {
                    this.mPushImageWidth = a.getDimension(attr, 30 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_push_image_height) {
                    this.mPushImageHeight = a.getDimension(attr, 30 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_left) {
                    this.mLeft = (int) a.getDimension(attr, 0 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_top) {
                    this.mTop = (int) a.getDimension(attr, 0 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_close_image) {
                    this.mCloseImageDrawable = a.getDrawable(attr);
                } else if (attr == R.styleable.SingleFingerView_close_image_width) {
                    this.mCloseImageWidth = a.getDimension(attr, 30 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_close_image_height) {
                    this.mCloseImageHeight = a.getDimension(attr, 30 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_shadow_image) {
                    this.mShadowImageDrawable = a.getDrawable(attr);
                } else if (attr == R.styleable.SingleFingerView_shadow_image_width) {
                    this.mShadowImageWidth = a.getDimension(attr, 200 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_shadow_image_height) {
                    this.mShadowImageHeight = a.getDimension(attr, 200 * _1dp);
                }
            }
        }
    }

    private void setViewToAttr(int pWidth, int pHeight) {
        if (null != mImageDrawable) {
            this.mView.setBackgroundDrawable(mImageDrawable);
        }
        if (null != mPushImageDrawable) {
            this.mPushView.setBackgroundDrawable(mPushImageDrawable);
        }

        if (null != mCloseImageDrawable) {
            this.mCloseView.setBackgroundDrawable(mCloseImageDrawable);
        }

        if (null != mShadowImageDrawable) {
            this.mShadowView.setBackgroundDrawable(mShadowImageDrawable);
        }

        FrameLayout.LayoutParams viewLP = (FrameLayout.LayoutParams) this.mView.getLayoutParams();
        viewLP.width = (int) mImageWidth;
        viewLP.height = (int) mImageHeight;
        int left = 0, top = 0;
        if (mCenterInParent) {
            left = pWidth / 2 - viewLP.width / 2;
            top = pHeight / 2 - viewLP.height / 2;
        } else {
            if (mLeft > 0) left = mLeft;
            if (mTop > 0) top = mTop;
        }
        viewLP.leftMargin = left;
        viewLP.topMargin = top;
        this.mView.setLayoutParams(viewLP);
        this.mShadowView.setLayoutParams(viewLP);


        FrameLayout.LayoutParams pushViewLP = (FrameLayout.LayoutParams) mPushView.getLayoutParams();
        pushViewLP.width = (int) mPushImageWidth;
        pushViewLP.height = (int) mPushImageHeight;
        pushViewLP.leftMargin = (int) (viewLP.leftMargin + mImageWidth - mPushImageWidth / 2);
        pushViewLP.topMargin = (int) (viewLP.topMargin + mImageHeight - mPushImageHeight / 2);
        mPushView.setLayoutParams(pushViewLP);

        FrameLayout.LayoutParams closeViewLP = (FrameLayout.LayoutParams) mCloseView.getLayoutParams();
        closeViewLP.width = (int) mCloseImageWidth;
        closeViewLP.height = (int) mCloseImageHeight;
        closeViewLP.leftMargin = (int) (viewLP.leftMargin - mCloseImageWidth / 2);
        closeViewLP.topMargin = (int) (viewLP.topMargin - mCloseImageHeight / 2);
        mCloseView.setLayoutParams(closeViewLP);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setParamsForView(widthMeasureSpec, heightMeasureSpec);
    }

    private boolean hasSetParamsForView = false;

    private void setParamsForView(int widthMeasureSpec, int heightMeasureSpec) {
        ViewGroup.LayoutParams layoutParams = getLayoutParams();
        if (null != layoutParams && !hasSetParamsForView) {
            System.out.println("");
            hasSetParamsForView = true;
            int width;
            if ((getLayoutParams().width == LayoutParams.MATCH_PARENT)) {
                width = MeasureSpec.getSize(widthMeasureSpec);
            } else {
                width = getLayoutParams().width;
            }
            int height;
            if ((getLayoutParams().height == LayoutParams.MATCH_PARENT)) {
                height = MeasureSpec.getSize(heightMeasureSpec);
            } else {
                height = getLayoutParams().height;
            }
            setViewToAttr(width, height);
        }
    }
}


一切都好。但是我需要做的是,当用户单击图像(贴纸)时,阴影和边框消失。当用户再次单击图像时,它们会再次出现。
我不知道该怎么办。

最佳答案

最后,我找到了正确的答案。我认为这可能会有所帮助。所以我分享。
首先,我在DragView类中引入了这样的Rigion对象:

public Region region;


然后,我在构造函数中添加了一行,如下所示:

region = new Region(mView.getLeft(), mView.getTop(), mView.getRight(), mView.getBottom());


然后,我在DragView.java文件中添加了一个方法:

    public boolean onTouchEvent (MotionEvent event){
        final int action = event.getAction();
        final int x = (int) event.getX();
        final int y = (int) event.getY();
        switch (action & MotionEventCompat.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                if (!region.contains(x, y)) {
                    mShadowView.setVisibility(INVISIBLE);
                    mCloseView.setVisibility(GONE);
                    mPushView.setVisibility(GONE);
                }
                break;
        }
        return true;
    }


因此,DragView.java填充将如下所示:

package com.seifi.dragtestapplication;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Region;
import android.graphics.drawable.Drawable;
import android.support.v4.view.MotionEventCompat;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;

public class DragView extends LinearLayout {
    private ImageView mView;
    private ImageView mPushView;
    private ImageView mCloseView;
    private View mShadowView;
    private float _1dp;
    private boolean mCenterInParent = true;
    private Drawable mImageDrawable, mPushImageDrawable, mCloseImageDrawable, mShadowImageDrawable;
    private float mImageHeight, mImageWidth, mPushImageHeight, mPushImageWidth, mCloseImageHeight, mCloseImageWidth, mShadowImageWidth, mShadowImageHeight;
    private int mLeft = 0, mTop = 0;

    public Region region;


    public DragView(Context context) {
        this(context, null, 0);
    }

    public DragView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public DragView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this._1dp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 1, context.getResources().getDisplayMetrics());
        this.parseAttr(context, attrs);
        View mRoot = View.inflate(context, R.layout.drag_layout, null);
        addView(mRoot, -1, -1);
        mPushView = (ImageView) mRoot.findViewById(R.id.push_view);
        mView = (ImageView) mRoot.findViewById(R.id.view);
        mCloseView = (ImageView) mRoot.findViewById(R.id.close_view);
        mShadowView = (View)mRoot.findViewById(R.id.shadowView);
        mView.setOnTouchListener(new ViewOnTouchListener(mPushView, mCloseView, mShadowView));

        region = new Region(mView.getLeft(), mView.getTop(), mView.getRight(), mView.getBottom());
    }



    private void parseAttr(Context context, AttributeSet attrs) {
        if (null == attrs) return;
        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SingleFingerView);
        if (a != null) {
            int n = a.getIndexCount();
            for (int i = 0; i < n; i++) {
                int attr = a.getIndex(i);
                if (attr == R.styleable.SingleFingerView_centerInParent) {
                    this.mCenterInParent = a.getBoolean(attr, true);
                } else if (attr == R.styleable.SingleFingerView_image) {
                    this.mImageDrawable = a.getDrawable(attr);
                } else if (attr == R.styleable.SingleFingerView_image_height) {
                    this.mImageHeight = a.getDimension(attr, 200 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_image_width) {
                    this.mImageWidth = a.getDimension(attr, 200 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_push_image) {
                    this.mPushImageDrawable = a.getDrawable(attr);
                } else if (attr == R.styleable.SingleFingerView_push_image_width) {
                    this.mPushImageWidth = a.getDimension(attr, 30 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_push_image_height) {
                    this.mPushImageHeight = a.getDimension(attr, 30 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_left) {
                    this.mLeft = (int) a.getDimension(attr, 0 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_top) {
                    this.mTop = (int) a.getDimension(attr, 0 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_close_image) {
                    this.mCloseImageDrawable = a.getDrawable(attr);
                } else if (attr == R.styleable.SingleFingerView_close_image_width) {
                    this.mCloseImageWidth = a.getDimension(attr, 30 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_close_image_height) {
                    this.mCloseImageHeight = a.getDimension(attr, 30 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_shadow_image) {
                    this.mShadowImageDrawable = a.getDrawable(attr);
                } else if (attr == R.styleable.SingleFingerView_shadow_image_width) {
                    this.mShadowImageWidth = a.getDimension(attr, 200 * _1dp);
                } else if (attr == R.styleable.SingleFingerView_shadow_image_height) {
                    this.mShadowImageHeight = a.getDimension(attr, 200 * _1dp);
                }
            }
        }
    }

    private void setViewToAttr(int pWidth, int pHeight) {
        if (null != mImageDrawable) {
            this.mView.setBackgroundDrawable(mImageDrawable);
        }
        if (null != mPushImageDrawable) {
            this.mPushView.setBackgroundDrawable(mPushImageDrawable);
        }

        if (null != mCloseImageDrawable) {
            this.mCloseView.setBackgroundDrawable(mCloseImageDrawable);
        }

        if (null != mShadowImageDrawable) {
            this.mShadowView.setBackgroundDrawable(mShadowImageDrawable);
        }

        FrameLayout.LayoutParams viewLP = (FrameLayout.LayoutParams) this.mView.getLayoutParams();
        viewLP.width = (int) mImageWidth;
        viewLP.height = (int) mImageHeight;
        int left = 0, top = 0;
        if (mCenterInParent) {
            left = pWidth / 2 - viewLP.width / 2;
            top = pHeight / 2 - viewLP.height / 2;
        } else {
            if (mLeft > 0) left = mLeft;
            if (mTop > 0) top = mTop;
        }
        viewLP.leftMargin = left;
        viewLP.topMargin = top;
        this.mView.setLayoutParams(viewLP);
        this.mShadowView.setLayoutParams(viewLP);


        FrameLayout.LayoutParams pushViewLP = (FrameLayout.LayoutParams) mPushView.getLayoutParams();
        pushViewLP.width = (int) mPushImageWidth;
        pushViewLP.height = (int) mPushImageHeight;
        pushViewLP.leftMargin = (int) (viewLP.leftMargin + mImageWidth - mPushImageWidth / 2);
        pushViewLP.topMargin = (int) (viewLP.topMargin + mImageHeight - mPushImageHeight / 2);
        mPushView.setLayoutParams(pushViewLP);

        FrameLayout.LayoutParams closeViewLP = (FrameLayout.LayoutParams) mCloseView.getLayoutParams();
        closeViewLP.width = (int) mCloseImageWidth;
        closeViewLP.height = (int) mCloseImageHeight;
        closeViewLP.leftMargin = (int) (viewLP.leftMargin - mCloseImageWidth / 2);
        closeViewLP.topMargin = (int) (viewLP.topMargin - mCloseImageHeight / 2);
        mCloseView.setLayoutParams(closeViewLP);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        setParamsForView(widthMeasureSpec, heightMeasureSpec);
    }

    private boolean hasSetParamsForView = false;

    private void setParamsForView(int widthMeasureSpec, int heightMeasureSpec) {
        ViewGroup.LayoutParams layoutParams = getLayoutParams();
        if (null != layoutParams && !hasSetParamsForView) {
            System.out.println("");
            hasSetParamsForView = true;
            int width;
            if ((getLayoutParams().width == LayoutParams.MATCH_PARENT)) {
                width = MeasureSpec.getSize(widthMeasureSpec);
            } else {
                width = getLayoutParams().width;
            }
            int height;
            if ((getLayoutParams().height == LayoutParams.MATCH_PARENT)) {
                height = MeasureSpec.getSize(heightMeasureSpec);
            } else {
                height = getLayoutParams().height;
            }
            setViewToAttr(width, height);
        }
    }



    public boolean onTouchEvent (MotionEvent event){
        final int action = event.getAction();
        final int x = (int) event.getX();
        final int y = (int) event.getY();
        switch (action & MotionEventCompat.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                if (!region.contains(x, y)) {
                    mShadowView.setVisibility(INVISIBLE);
                    mCloseView.setVisibility(GONE);
                    mPushView.setVisibility(GONE);
                }
                break;
        }
        return true;
    }
}


最后,我们必须将这些行添加到ViewOnTouchListener.java文件中:

        mShadowView.setVisibility(View.VISIBLE);
        mCloseView.setVisibility(View.VISIBLE);
        mPushView.setVisibility(View.VISIBLE);


因此,该文件将是:

package com.seifi.dragtestapplication;

import android.graphics.Point;
import android.view.MotionEvent;
import android.view.View;
import android.widget.FrameLayout;

class ViewOnTouchListener implements View.OnTouchListener {
    Point pushPoint, closePoint;
    int lastImgLeft;
    int lastImgTop;
    FrameLayout.LayoutParams viewLP;
    FrameLayout.LayoutParams pushBtnLP;
    FrameLayout.LayoutParams closeBtnLP;
    int lastPushBtnLeft, lastCloseBtnLeft;
    int lastPushBtnTop, lastCloseBtnTop;
    private View mPushView, mCloseView, mShadowView;

    ViewOnTouchListener(View mPushView, View mCloseView, View mShadowView) {
        this.mPushView = mPushView;
        this.mCloseView = mCloseView;
        this.mShadowView = mShadowView;
    }

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                if (null == viewLP) {
                    viewLP = (FrameLayout.LayoutParams) view.getLayoutParams();
                }
                if (null == pushBtnLP) {
                    pushBtnLP = (FrameLayout.LayoutParams) mPushView.getLayoutParams();
                }

                if (null == closeBtnLP) {
                    closeBtnLP = (FrameLayout.LayoutParams) mCloseView.getLayoutParams();
                }
                closePoint = getRawPoint(event);
                pushPoint = getRawPoint(event);
                lastImgLeft = viewLP.leftMargin;
                lastImgTop = viewLP.topMargin;
                lastPushBtnLeft = pushBtnLP.leftMargin;
                lastPushBtnTop = pushBtnLP.topMargin;

                lastCloseBtnLeft = closeBtnLP.leftMargin;
                lastCloseBtnTop = closeBtnLP.topMargin;
                (mShadowView).setBackgroundResource(R.drawable.my_shadow_pressed);

                mShadowView.setVisibility(View.VISIBLE);
                mCloseView.setVisibility(View.VISIBLE);
                mPushView.setVisibility(View.VISIBLE);
                break;
            case MotionEvent.ACTION_MOVE:
                Point newPoint = getRawPoint(event);
                float moveX = newPoint.x - pushPoint.x;
                float moveY = newPoint.y - pushPoint.y;

                viewLP.leftMargin = (int) (lastImgLeft + moveX);
                viewLP.topMargin = (int) (lastImgTop + moveY);
                view.setLayoutParams(viewLP);

                pushBtnLP.leftMargin = (int) (lastPushBtnLeft + moveX);
                pushBtnLP.topMargin = (int) (lastPushBtnTop + moveY);
                mPushView.setLayoutParams(pushBtnLP);

                closeBtnLP.leftMargin = (int) (lastCloseBtnLeft + moveX);
                closeBtnLP.topMargin = (int) (lastCloseBtnTop + moveY);
                mCloseView.setLayoutParams(closeBtnLP);

                break;
            case MotionEvent.ACTION_UP: {
                (mShadowView).setBackgroundResource(R.drawable.my_shadow);
                break;
            }
        }
        return false;
    }

    private Point getRawPoint(MotionEvent event) {
        return new Point((int) event.getRawX(), (int) event.getRawY());
    }
}


现在,一切都好
完美的作品。 LINK OF VIDEO

07-24 15:24