Android实现可移动组件(刷新界面不复原)

先上效果图:


以下是我自定义的view(代码中已经有了详细解释,直接拿来使用即可):

注意:自定义view好处就是自定义完成后直接就拿来使用,很方便,但是不好就是,里面的onTouchEvent方法会把点击,长按事件屏蔽,也就是我们不能.setOnClickListener了

注意:自定义view其他自定义的构造方法可以有,但默认的三个构造方法必须实现,不然可能会出现Custom view MySwitchBtn is not using the 2- or3-argument View constructors; XML attributes will not work 的错误。

参照博客:http://blog.csdn.net/xiaonadiandian/article/details/46379767

最后直接在xml中引用就行了

当然除了自定义view,通过重写方法的方式,也可以直接在活动中直接监听组件的onTouchEvent方法。

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.FrameLayout;

/**
 * 步骤一:自定义可移动组件
 * @author NewBies
 * @date 2017/12/26
 */
public class VertexView extends android.support.v7.widget.AppCompatTextView{

    private int startX;
    private int startY;
    private int endX;
    private int endY;
    private FrameLayout.LayoutParams layoutParams;

    public VertexView(Context context) {
        super(context);
    }

    public VertexView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public VertexView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    /**
     * 步骤二:重写onTouchEvent事件
     * @param event
     * @return
     */
    @Override
    public boolean onTouchEvent(MotionEvent event){
        //步骤三:获取手机触摸点的横坐标和纵坐标
        endX = (int)event.getX();
        endY = (int)event.getY();

        //步骤四:获取布局参数实例,注意:xx.LayoutParams这里的xx应该是该组件的父布局类型
        //注意:这句话必须在该组件已经添加到父布局中才会起作用,所以这句话我没有写在构造函数中,而是写在这里
        layoutParams = (FrameLayout.LayoutParams) this.getLayoutParams();

        switch (event.getAction()){
            //监听按下去的事件,这个事件在每次拖动时,必定会执行,也只执行一次
            case MotionEvent.ACTION_DOWN:
                //将按下去的点记录为起始点
                startX = endX;
                startY = endY;
                break;
            //步骤五:监听移动事件,该事件会在拖动时执行N次
            case MotionEvent.ACTION_MOVE:
                //计算移动的距离
                int offsetX = endX - startX;
                int offsetY = endY - startY;

                //调用layout方法来重新放置它的位置
                layoutParams.setMargins(getLeft() + offsetX, getTop() + offsetY, getRight() + offsetX, getBottom() + offsetY);
                //刷新
                requestLayout();
                break;
            //监听抬起事件,该事件同按下去的时间一样,只执行一次
            case MotionEvent.ACTION_UP:
                break;
            default:break;
        }
        //这里应该返回true,这里涉及到了android的事件拦截机制,大致意思是,我的事件是在哪里处理,就在那里的事件返回TRUE
        return  true;
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值