【代码】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];
// 使用压力值
}
}
需要注意的是这些部分:
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];
// 使用压力值
}
其他的按常规写就行了。
屏幕压感
这个需要分两种情况,一种情况是不带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; // 表示此事件已被处理
}
请注意,这段代码应该添加到你的视图或活动中,具体取决于你想要处理触摸事件的位置。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来处理其他事件类型
}
}
贴到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;
}
其中的touches不是未定义的变量,而是它自带的,就和width、height一样,能直接用。
就很简单,非常简单,让我感觉上面所有的努力都是sb。
【代码】Android|获取压力传感器、屏幕压感数据(大气压、原生和Processing)的更多相关文章
- android获取设备屏幕大小的方法
// 通过WindowManager获取 DisplayMetrics dm = new DisplayMetrics(); getWindowManager().getDefaultDisplay( ...
- Android获取 应用程序大小,数据大小,缓存大小
在项目中创建,android.content.pm 包名.里面创建两个aidl文件.PackageStats.aidl 和 IPackageStatsObserver.aidl. PackageSt ...
- android 获取当前屏幕作为毛玻璃模糊背景Acitivity作为弹出框。
使用: 1.在执行弹出界面前,先将其当前屏幕截图. BlurBuilder.snapShotWithoutStatusBar(getActivity()); 2.为了确保界面切入无效果. startA ...
- Android获取手机屏幕宽高
//如果是获取单位是像素,可以如下: Display display = getWindowManager().getDefaultDisplay(); Point size = new Point( ...
- android获取手机屏幕分辨率
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt ...
- Android获取设备屏幕宽高像素值的两个方法
private void get1() { Resources resources = this.getResources(); DisplayMetrics dm = resources.getDi ...
- Android中获取网页表单中的数据实现思路及代码
在Android中获取网页里表单中的数据具体实现代码如下,感兴趣的各位可以参考过下哈,希望对大家有所帮助 MainActivity如下: 复制代码 代码如下: package cn.testjavas ...
- Android获取屏幕的大小与密度的代码
Android项目开发中很多时候需要获取手机屏幕的宽高以及屏幕密度来进行动态布局,这里总结了三种获取屏幕大小和屏幕密度的方法 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...
- 【WPF】获取电磁笔的压感
WPF 不仅支持触控,也支持笔的输入,比如现在比较高大上的电磁笔.便宜的板子一般不配备电磁笔,而是配电容笔,虽然也号称XXX级压感,但是效果自然不可与电磁笔相比. UIElement 类规范了UI元素 ...
- Android 获取屏幕尺寸与密度
android中获取屏幕的长于宽,参考了网上有很多代码,但结果与实际不符,如我的手机是i9000,屏幕大小是480*800px,得到的结果却为320*533 结果很不靠谱,于是自己写了几行代码,亲 ...
随机推荐
- hbase - [06] rowkey的设计
HBase是三维有序存储的,通过rowkey(行键),column key(column family和qualifier)和TimeStamp(时间戳)这三个维度可以对HBase中的数据进行快速定位 ...
- Shell - 脚本案例
题记部分 一.节点状态监控脚本(nodeStatusCheck.sh) [脚本名称]nodeStatusCheck.sh [监控规则]通过ping的方式监控集群节点状态,检查节点是否失联 [实现方式] ...
- go gin web服务器使用fvbock/endless优雅地重启或停止
gin使用fvbock/endless gin 正常使用注册路由时: package main import "github.com/gin-gonic/gin" func mai ...
- 怎么解决DB读写分离,导致数据不一致问题?
前言 在互联网中大型项目中,读写分离应该是我们小伙伴经常听说的,这个主要解决大流量请求时,提高系统的吞吐量.因为绝大部分互联网产品都是读多写少,大部分都是读请求,很小部分是写请求. 上图: 1)一个主 ...
- laravel proc_get_status() has been disabled for security reasons
解决办法: 在php.ini中,找到disable_functions选项,看看后面是否有proc_open函数被禁用了,去掉proc_get_status,proc_open即可
- selenium自动化测试-获取黄金实时价格
最近黄金比较火爆,想要获取黄金实时价格,方便后续监控预警价格,一般实时刷新的网页数据都是动态加载的,需要用到selenium自动化测试获取动态页面数据. 昨天学会了获取动态网页小说内容,同理也可以获取 ...
- 手写Rpc框架-1
手写Rpc框架 - 导读 git仓库-all-rpc GTIEE:https://gitee.com/quercus-sp204/all-rpc [参考源码 yrpc] 1. Rpc概念 RPC 即远 ...
- EBUSY: resource busy or locked, rmdir
方案一: 方案二: !!! 出现问题后,千万不要忽略npm提示你的警告... 如果以上两种方案还未解决,那么大概率是因为你的npm版本较低导致的,升级你的npm. cnpm install -g np ...
- Delphi 动态生成进度条窗体
在implementation加入下面 uses Gauges; var Gauge1: TGauge; 加入Timer1控件,设为false procedure TForm1.Button1Clic ...
- 几款ZooKeeper可视化工具,最后一个美炸了~
首发于公众号:BiggerBoy 欢迎关注,查看更多技术文章 ZooKeeper是我们工作中常用一个开源的分布式协调服务,提供分布式数据一致性解决方案,分布式应用程序可以实现数据发布订阅.负载均衡.命 ...