IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android (画板/模拟鼠标) 自定义View&轨迹传输定义 -> 正文阅读

[移动开发]Android (画板/模拟鼠标) 自定义View&轨迹传输定义

画板/鼠标垫 自定义view代码:

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

/*
 *Author:XingHai.Zhao
 *Purpose:鼠标垫/画板
 */
public class MouseMat extends View {

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

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

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

    private Path path;
    private Paint paint;

    private void init() {
        path = new Path();
        paint = new Paint();
        paint.setColor(Color.CYAN); //颜色
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(10); //边框宽度
        setClickable(true);//设置可点击
    }

    public MouseTouchListener mouseTouchListener;

    public interface MouseTouchListener {
        void MouseEvent(MotionEvent event);
    }

    public void setMouseTouchListener(MouseTouchListener mouseTouchListener) {
        this.mouseTouchListener = mouseTouchListener;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                path.moveTo(event.getX(), event.getY());
                break;
            case MotionEvent.ACTION_MOVE:
                path.lineTo(event.getX(), event.getY());
                invalidate();
                break;
            case MotionEvent.ACTION_UP: // 如果做画板,则注释该UP处理
                //手指抬起,清除痕迹
                reset();
                break;
        }
        if (mouseTouchListener != null)
            mouseTouchListener.MouseEvent(event);
        return super.onTouchEvent(event);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawPath(path, paint);
    }

    /*
     *Author:XingHai.Zhao
     *Purpose: 清除内容
     */
    public void reset() {
        path.reset();
        invalidate();
    }
}

如果只需要画板效果,不想要手指抬起清除痕迹的效果,

可以注释掉抬起事件的reset()方法被动调用

如果需要主动清除画板内容,则可以在外部直接调用画板对象的reset()方法

鼠标滑动偏移量抛出:

        MouseMat MyMouseMat = findViewById(R.id.mouse_mat);
        //手势监听 CSDN-深海呐
        MyMouseMat.setMouseTouchListener(new MouseMat.MouseTouchListener() {
            @Override
            public void MouseEvent(MotionEvent event) {

                int num;
                float X = event.getX();
                float Y = event.getY();
                if (lastX != 0) { //过滤0 防止第一次接到时间跳跃
                    num = (int) (X - lastX);
                    // 防止多点触控 大距离跳跃
                    if (num < 100 && num > -100 && num != 0 && Math.abs(num) > 4) { 
                        Log.i(TAG, "X移动:" + num);
                        //这里抛出正在X偏移量
                    }
                }
                if (lastY != 0) {
                    num = (int) (Y - lastY);
                    if (num < 100 && num > -100 && num != 0 && Math.abs(num) > 4) {
                        Log.i(TAG, "Y移动:" + num);
                        //这里抛出正在Y偏移量
                    }
                }

                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    Log.i(TAG, "ACTION_DOWN");
                    date = new Date();
                    downTime = date.getTime();//记录按下时间,方便判断点击时间
                }
                if (event.getAction() == MotionEvent.ACTION_UP) {
                    Log.i(TAG, "ACTION_UP");
                    date = new Date();
                    if ((date.getTime() - downTime) < 200) {  //点击判定
                        Log.i(TAG, "点击触发");
                        //这里抛出点击事件
                    }
                    lastX = 0;
                    lastY = 0;
                }
                lastX = X;
                lastY = Y;
            }

        });

这里X和Y的偏移量 分别在对应注释的地方抛出 , 可以将偏移量传输到远程设备上,实现手机屏幕作为鼠标操作远程设备的鼠标移动和点击。

点击事件抛出的地方见代码中注释。

关于偏移量的记录判定有两个核心值:

????????1.正负100值: 过滤掉手指腾空移位,或多指触控的偏移量大跳,这里优化的场景类似与实际鼠标使用场景(比如:鼠标移动到鼠标垫边界,再拿起鼠标放到鼠标垫中间继续移动)。

? ? ? ? 2.绝对值4:过滤鼠标的小幅度移动,另一方面也减少了偏移事件的抛出频率。

这两个值可根据实际体验进行调整。

关于双击事件或者跟多连续点击事件:

? ? ? ? 这边根据点击间隔200毫秒进行判定记录,可根据实际体验进行调整,如果需要更多次点击事件,核心判定思想可以看这里:https://blog.csdn.net/qq_39731011/article/details/114868495

如果感觉文章有帮助到您的话请点个赞吧!

如果有什么问题或者文章错误指出的话欢迎评论区留言!

深海谢过各位同行。

????????

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-26 12:13:18  更:2021-08-26 12:14:38 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:42:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码