<android>两个很简单的自定义view (浮动tv,左侧收回,右侧收回效果) 类似360浮动球 & 上下手势滑动滚出屏幕,和回弹动画

        两个很简单的自定义view  (浮动tv,左侧收回,右侧收回效果) 类似360浮动球 & 上下手势滑动滚出屏幕,和回弹动画 

 

 

1上代码:

@SuppressLint("AppCompatCustomView")
public class ReverseMenu extends TextView {
    Context context;
    private int width;
    private int heights;
    private TranslateAnimation down;
    private boolean isLeft = true;
    private TVlisten listens;
    private int height;
    private float scroX;
    private boolean scrolIsLeft = true;
    private int lastX, lastY;
    private int l;
    private int b;
    private int r;
    private int t;
    private int l_ok;
    private int t_ok;
    private int r_ok;
    private int b_ok;
    private int soushiX;
    private float mReX;
    private int returns_left;
    private int returns_right;
    private boolean layout_;

    public ReverseMenu(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.context = context;
        // TODO Auto-generated constructor stub
        inits();
    }

    public ReverseMenu(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
        // TODO Auto-generated constructor stub
        this.context = context;
        inits();
    }

    public ReverseMenu(Context context) {
        this(context, null);
        this.context = context;
        // TODO Auto-generated constructor stub
        inits();
    }


    @Override
    public void layout(int l1, int t1, int r1, int b1) {
        if (!layout_) {
            super.layout(l1, t1, r1, b1);
        } else {
            //用于home 灭屏返回上次移动位置
            super.layout(l_ok, t_ok, r_ok, b_ok);
        }
    }


    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        super.onWindowFocusChanged(hasWindowFocus);
        if (!hasWindowFocus)
            layout_ = true; //设置标识,用于home 灭屏返回上次移动位置
    }

    /**
     * 初始化公用参数
     */
    private void inits() {
        WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        DisplayMetrics dm = new DisplayMetrics();
        wm.getDefaultDisplay().getMetrics(dm);
        width = dm.widthPixels;
        heights = dm.heightPixels;
        height = getHeight();
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:  //按下手势
                layout_ = false;
                lastX = (int) event.getRawX();
                lastY = (int) event.getRawY();
                scroX = event.getX();
                break;
            case MotionEvent.ACTION_MOVE:  //移动手势
                layout_ = false;
                if (isLeft) {
                    if (event.getRawX() < mReX) {
                        //回划手势了
                        returns_left = 1;
                    }
                } else {
                    if (event.getRawX() > mReX) {
                        //回划手势了
                        returns_right = 1;
                    }
                }
                mReX = event.getRawX();

                int dx = (int) event.getRawX() - lastX;
                int dy = (int) event.getRawY() - lastY;
                soushiX = dx;
                l = getLeft() + dx;
                b = getBottom() + dy;
                r = getRight() + dx;
                t = getTop() + dy;

                if (isLeft) {
                    if (l >= 0) {
                        l = 0;
                        r = l + getWidth();
                    }
                } else {
                    if (r <= width + 50) {
                        r = width + 50;
                        l = r - getWidth();
                    }
                }

                if (t < 0) {
                    t = 0;
                    b = t + getHeight();
                }

                if (b > heights - 500) {
                    b = heights - 500;
                    t = b - getHeight();
                }
                layout(l, t, r, b);
                lastX = (int) event.getRawX();
                lastY = (int) event.getRawY();
                postInvalidate();
                break;


            case MotionEvent.ACTION_UP:  //放开手势
                layout_ = false;
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    float x1 = event.getX();
                    if (x1 - scroX > 200) {
                        scrolIsLeft = false;
                    } else if (scroX - x1 > 200) {
                        scrolIsLeft = true;
                    }

                    if (scrolIsLeft) {
                        //左反弹
                        layout(-110, t, 200, b);
                        l_ok = -110;
                        t_ok = t;
                        r_ok = 200;
                        b_ok = b;
                        setBackgroundResource(R.drawable.runfast_float_bg);
                        setText("圈子");
                        setGravity(Gravity.CENTER | Gravity.RIGHT);
                        startInAnmin(1);
                        if (!isLeft) {
                            listens.TvChangeListener(0);
                        }
                        isLeft = true;
                    } else {
                        //右反弹
                        layout(width - 200, t, width + 160, b);
                        l_ok = width - 200;
                        t_ok = t;
                        r_ok = width + 160;
                        b_ok = b;
                        setBackgroundResource(R.drawable.runfast_float_bg_right);
                        setText("    发现");
                        setGravity(Gravity.CENTER | Gravity.LEFT);
                        startInAnmin(2);
                        if (isLeft) {
                            listens.TvChangeListener(1);
                        }
                        isLeft = false;
                    }
                }
                break;
            default:
                break;
        }
        return true;
    }


    /**
     * 执行动画
     *
     * @param i
     */
    private void startInAnmin(int i) {
        if (i == 1) {
            down = new TranslateAnimation(0, -50, 0, 0);
        } else if (i == 2) {
            down = new TranslateAnimation(0, 50, 0, 0);
        }
        down.setFillAfter(true);
        down.setInterpolator(new BounceInterpolator());
        down.setDuration(700);
        startAnimation(down);
    }


    public interface TVlisten {
        /**
         * 滑动至左或者右边的监听
         *
         * @param type 1 左边   2 左边
         */
        void TvChangeListener(int type);
    }

    /**
     * 设置监听 tvListener
     *
     * @param tvListener
     */
    public void setTVListener(TVlisten tvListener) {
        listens = tvListener;
    }
}

2上代码:

 

public class ScrollRelayout extends RelativeLayout {
    private float mPosX;
    private float mPosY;
    private float mCurPosX;
    private float mCurPosY;
    Context context;

    public ScrollRelayout(Context context) {
        super(context);
        this.context = context;
    }

    public ScrollRelayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
    }

    public ScrollRelayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
    }


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

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                mPosX = event.getX();
                mPosY = event.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                mCurPosX = event.getX();
                mCurPosY = event.getY();
                if (mCurPosY - mPosY > 0) {  //向下
                    if (mCurPosY - mPosY < 855) {
                        scrollTo(0, -(int) (mCurPosY - mPosY));
                    } else {
                        scrollTo(0, -1600);
                    }
                } else {
                    if (mCurPosY - mPosY > -855) {
                        scrollTo(0, -(int) (mCurPosY - mPosY));
                    } else {
                        scrollTo(0, 1600);
                    }
                }
                break;

            case MotionEvent.ACTION_UP:

                Log.e("=============", "mCurPosY" + mCurPosY);
                Log.e("=============", "mPosY" + mPosY);

                if (mCurPosY - mPosY > 0) {  //向下
                    if (mCurPosY - mPosY < 855) {
                        PageAnmin();
                        scrollTo(0, 0);
                    } else {
                        scrollTo(0, -1600);
                    }
                } else {
                    if (mCurPosY - mPosY > -855) {
                        PageAnmin();
                        scrollTo(0, 0);
                    } else {
                        scrollTo(0, 1600);
                    }
                }

                if (mCurPosY - mPosY > 0 && (Math.abs(mCurPosY - mPosY) > 855)) {
                    //向下滑動
                    Toast.makeText(context, "向下", Toast.LENGTH_SHORT).show();
                } else if (mCurPosY - mPosY < 0 && (Math.abs(mCurPosY - mPosY) > 855)) {
                    //向上滑动
                    Toast.makeText(context, "向上", Toast.LENGTH_SHORT).show();
                }

                if (mCurPosX - mPosX > 0 && (Math.abs(mCurPosX - mPosX) > 25)) {
                    // 向左滑動
                } else if (mCurPosX - mPosX < 0 && (Math.abs(mCurPosX - mPosX) > 25)) {
                    //向右滑动
                }
                break;
        }
        return true;
    }


    private void PageAnmin() {

        //设定误差范围  误差之内认定单击动作 不执行动画
        if (Math.abs(mCurPosY - mPosY) < 10) {
            heartAnmin();
            return;
        }
        ScaleAnimation sa = new ScaleAnimation(1f, 1f, 0.9f, 1f);
        sa.setDuration(600);
        sa.setInterpolator(new BounceInterpolator());
        startAnimation(sa);
    }


    private void heartAnmin() {
        final ImageView imageView = new ImageView(context);
        LayoutParams params = new LayoutParams(250, 250);
        params.leftMargin = (int) mPosX - 125;
        params.topMargin = (int) mPosY - 125;
        imageView.setImageDrawable(getResources().getDrawable(R.mipmap.hearted_main));
        imageView.setLayoutParams(params);
        addView(imageView);
        ScaleAnimation sa = new ScaleAnimation(0.5f, 1f, 0.5f, 1f);
        sa.setDuration(600);
        sa.setInterpolator(new BounceInterpolator());
        imageView.startAnimation(sa);
        sa.setAnimationListener(new Animation.AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {

            }

            @Override
            public void onAnimationEnd(Animation animation) {
                removeView(imageView);
            }

            @Override
            public void onAnimationRepeat(Animation animation) {

            }
        });
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值