Android(自定义图标)可拖动并带有吸附边缘效果

本文介绍如何在Android中创建一个可拖动的视图,并实现视图在拖动过程中自动吸附到屏幕边缘的功能。通过自定义View并设置布局,可以实现这一交互效果。
部署运行你感兴趣的模型镜像

很简单,只需要自定义一个View就可以。

布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.example.myapplication.initview.CustomViews
        android:id="@+id/cus"
        android:layout_marginTop="60dp"
        android:src="@mipmap/home_sign"
        android:layout_width="60dp"
        android:layout_height="60dp" />
</RelativeLayout>

然后自定义的View:

package com.example.myapplication.initview;
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
/**
 * Created by pw on 2019/3/28 13:32
 * E-Mail Address: pw163.com
 */
public class CustomViews extends ImageView {
    private int maxWidth;
    private int maxHeight;
    private int viewWidth;
    private int viewHeight;
    private float downx;
    private float downy;
    public CustomViews(Context context) {
        super(context, null);
    }

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

    public CustomViews(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //屏幕得宽度
        maxWidth = UiUtil.getMaxWidth(getContext());
        //屏幕得高度
        maxHeight = UiUtil.getMaxHeight(getContext());
        /**
         *  控件的宽高
         */
        viewWidth = canvas.getWidth();
        viewHeight = canvas.getHeight();
    }
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                clearAnimation();
                downx = event.getX();
                downy = event.getY();
                return true;
            case MotionEvent.ACTION_MOVE:
                float moveX = event.getRawX() - downx;
                float moveY = event.getRawY() - downy;
                moveX = moveX < 0 ? 0 : (moveX + viewWidth > maxWidth) ? (maxWidth - viewWidth) : moveX;
                moveY = moveY < 0 ? 0 : (moveY + viewHeight) > maxHeight ? (maxHeight - viewHeight) : moveY;
                this.setY(moveY);
                this.setX(moveX);
                return true;
            case MotionEvent.ACTION_UP:
                //做吸附效果
                float centerX = getX() + viewWidth / 2;
                if (centerX > maxWidth/2){
                    //靠右吸附
                    animate().setInterpolator(new DecelerateInterpolator())
                            .setDuration(500)
                            .xBy(maxWidth-viewWidth-getX())
                            .start();
                }else {
                    animate().setInterpolator(new DecelerateInterpolator())
                            .setDuration(500)
                            .x(0)
                            .start();
                }
                return true;
            default:
                return super.onTouchEvent(event);
        }
    }
}

 

您可能感兴趣的与本文相关的镜像

Wan2.2-T2V-A5B

Wan2.2-T2V-A5B

文生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值