• 【代码】Android|获取压力传感器、屏幕压感数据(大气压、原生和Processing)


    首先需要分清自己需要的是大气压还是触摸压力,如果是大气压那么就是TYPE_PRESSURE,可以参考https://source.android.google.cn/docs/core/interaction/sensors/sensor-types?hl=zh-cn。如果是触摸压力就是另一回事,我需要的是触摸压力。

    不过我整错了,一开始做成了大气压,后来又先做了原生的才发现Processing已经实现了,那么现在把两种代码都贴一下吧。

    如果你和我一样都是用Processing-Android的,请你直接看最后一种方法,前面都别看了

    压力传感器

    import android.app.Activity;
    import android.os.Bundle;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    
    public class PressureSensorActivity extends Activity implements SensorEventListener {
        private SensorManager sensorManager;
        private Sensor pressureSensor;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            pressureSensor = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            sensorManager.registerListener(this, pressureSensor, SensorManager.SENSOR_DELAY_NORMAL);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            sensorManager.unregisterListener(this);
        }
    
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    
        @Override
        public void onSensorChanged(SensorEvent event) {
            float pressure = event.values[0];
            // 使用压力值
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42

    需要注意的是这些部分:

    import android.app.Activity;
    import android.os.Bundle;
    import android.hardware.Sensor;
    import android.hardware.SensorEvent;
    import android.hardware.SensorEventListener;
    import android.hardware.SensorManager;
    
    ...
    
    	private SensorManager sensorManager;
        private Sensor pressureSensor;
    ...
    
    		sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
            pressureSensor = sensorManager.getDefaultSensor(Sensor.TYPE_PRESSURE);
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            sensorManager.registerListener(this, pressureSensor, SensorManager.SENSOR_DELAY_NORMAL);
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            sensorManager.unregisterListener(this);
        }
    
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    
        @Override
        public void onSensorChanged(SensorEvent event) {
            float pressure = event.values[0];
            // 使用压力值
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    其他的按常规写就行了。

    屏幕压感

    这个需要分两种情况,一种情况是不带processing的时候写的,另一种是在processing-Android的基础上写的。我是需要结合processing的。但是我不幸的是我两种都写了。

    原生Android

    注:附带一点GPT的说明,不然我怕就贴个代码太枯燥了。

    在安卓平台上,"压感"通常指的是触摸屏幕时的压力感应,这与气压传感器(通常用于测量环境气压)是不同的。如果你的平板支持触摸压力(也称为力度或压感级别),那么这通常是通过触摸事件而不是传感器事件来获取的。

    要处理触摸事件中的压力,你需要覆盖 View 的 onTouchEvent(MotionEvent event) 方法。MotionEvent 对象包含与触摸相关的所有数据,包括压力。这里是如何实现它的一个基本例子:

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // 获取动作类型
        int action = event.getActionMasked();
    
        // 获取触摸事件的压力值
        float pressure = event.getPressure();
    
        // 根据触摸事件类型处理压力值
        switch (action) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
            case MotionEvent.ACTION_UP:
                // 在这里处理压力值,例如打印出来
                Log.d("Pressure", "Current pressure: " + pressure);
                break;
        }
    
        return true; // 表示此事件已被处理
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    请注意,这段代码应该添加到你的视图或活动中,具体取决于你想要处理触摸事件的位置。onTouchEvent 方法在用户触摸屏幕时被调用,event.getPressure() 会返回当前触摸点的压力值,通常范围是从0(没有压力)到1(最大压力),但实际的最大值可能取决于具体设备。

    另外,不是所有的设备都支持触摸压力,这取决于具体的硬件。如果你在上述代码中始终得到相同的压力值(例如,始终是1),那可能是你的设备不支持压力感应,或者支持的压力范围非常有限。在这种情况下,你可能需要检查设备规格,或者使用其他类型的输入来增强用户体验。

    注:这代码俺也不知道怎么用,应该是贴在主活动Activity就能用了。

    Processing压感

    Processing-Android压感呢,有两种实现方式,一种是直接重写它的压感类,是能用的但是不是很好用,因为它会覆盖其他的事件,这让人糟心,因为其他的事件全部都会废掉;另一种是非常非常简单,正常人都不会想到。

    GPT说重写压感事件函数

    如果你在使用 Processing(看起来你的代码是基于 Processing 库或框架),处理 MotionEvent 的方式可能会有所不同。在 Processing 中,你通常会重写 mousePressed(), mouseDragged() 等方法来处理触摸事件,而不是直接处理 MotionEvent。

    然而,如果你需要直接访问 MotionEvent 对象,你可以在 Processing 中重写 surfaceTouchEvent(MotionEvent event) 方法。这个方法在 Processing 环境中被调用,当有触摸事件发生时,传递给你一个 MotionEvent 对象。例如:

    public void surfaceTouchEvent(MotionEvent event) {
        int action = event.getActionMasked();
        float x = event.getX();
        float y = event.getY();
        float pressure = event.getPressure();
    
        // 处理不同的触摸事件
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                // 处理按下动作
                break;
            case MotionEvent.ACTION_MOVE:
                // 处理移动动作
                break;
            case MotionEvent.ACTION_UP:
                // 处理抬起动作
                break;
            // 可以添加更多的case来处理其他事件类型
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    贴到Processing中间,然后拿平板的笔一写啊,真的能用!
    在这里插入图片描述

    帅。

    但是随后我就发现我的其他和touch相关的事件全部失效了。

    坏。

    Github倾情推荐的touches数组

    大佬的贡献:https://github.com/processing/processing-android/issues/226

    如果不想看英文那么我简单翻译一下这个issue的意思:
    大佬说:这个touch事件问题这么多,我给改了一下,暴露出来了touches数组,常用功能呢这里都有,用的时候直接调用就可以了。
    大佬(谦虚.jpg):应该可以浅浅解决某某某、某某某、某某这三个issue。

    所以就是这样,使用这个就行了。具体使用方式示例:

    // get pressure 取第一个touches的压力值
    for (int i = 0; i < touches.length; i++) {
      pressure = touches[i].pressure;
      break;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    其中的touches不是未定义的变量,而是它自带的,就和width、height一样,能直接用。

    就很简单,非常简单,让我感觉上面所有的努力都是sb。

  • 相关阅读:
    再说Mdx的字典文件处理
    常用的CSS
    GO语言的由来与发展历程
    【云原生】Spring Cloud微服务学习路线汇总
    Kotlin 伴生对象(companion object) VS 包函数
    MySQL优化:从十几秒优化到三百毫秒
    leetcode 503.下一个更大元素II 单调栈
    if条件表达式和while循环语句
    Helm实战案例一:在Kubernetes上使用Helm搭建Prometheus Operator监控
    6. 装饰器
  • 原文地址:https://blog.csdn.net/qq_46106285/article/details/136440905