搁浅` 2021-01-27 11:32 采纳率: 50%
浏览 34

input_mt_init_slots函数是B协议专有的函数吗?

我将自己这边的MT 协议B改为协议A后,屏幕上的报点卡死无触,但系统输入getevent -lt后能读到手触控的动作信息,请问这是怎么回事

  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-24 14:08
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在Android设备上,input_mt_init_slots() 函数是用于管理触摸屏(通常是 MT (Multi Touch)协议的)响应情况的。这个函数的主要作用是在启动时为触摸屏分配预定义的滑块和缩放区域,以确保各种类型的触摸事件被正确地处理。

    以下是一个基于B(触摸屏协议)更新后的MTP(多触点协议)应用程序中调用input_mt_init_slots()的示例代码:

    import android.hardware.Sensor;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class MyApp extends AppCompatActivity {
    
        private TextView tv touchAreaText;
        private Sensor touchAreaSensor;
        private int[] slots = {
                0, // x轴滑块位置
                0, // y轴滑块位置
                0, // z轴滑块位置
                100, // x轴缩放比例
                0, // y轴缩放比例
                0, // z轴缩放比例
            };
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            tvTouchAreaText = findViewById(R.id.tv_touch_area_text);
            touchAreaSensor = findViewById(R.id.touch_area_sensor);
    
            initSlots();
        }
    
        private void initSlots() {
            // 初始化触控区域滑块的位置和缩放比例
            touchAreaSensor.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View view, MotionEvent motionEvent) {
                    switch (motionEvent.getAction()) {
                        case MotionEvent.ACTION_DOWN:
                            if (touchAreaSensor.getDeviceId().equals("YOUR_DEVICE_ID")) {
                                // 移动到坐标x轴指定位置
                                int slotX = slot[0];
                                int slotY = slot[1];
    
                                // 根据触摸滑块的滑动方向进行对应调整
                                if (motionEvent.getX() < slotX) {
                                    slot[1] += slots[1] * motionEvent.getY();
                                } else {
                                    slot[1] -= slots[1] * motionEvent.getY();
                                }
                            }
                            break;
                        case MotionEvent.ACTION_MOVE:
                            // 按照滑块的相对位置移动触控区域
                            int slotX = touchAreaSensor.getX() + motionEvent.getX() - slotX;
                            int slotY = touchAreaSensor.getY() + motionEvent.getY() - slotY;
                            slots[slotY]++;
                            if (slots[slotY] == slots[slots.length - 1]) {
                                slots[slotY]--;
                            }
                            break;
                        case MotionEvent.ACTION_UP:
                            // 移动到触控区域末尾
                            if (slotY > slots[slots.length - 1]) {
                                slot[1]--;
                            }
                            break;
                    }
    
                    return true;
                }
            });
    
            tvTouchAreaText.setText(String.format("%d/%d/%d", slot[0], slot[1], slot[2]));
        }
    }
    

    在这个例子中,我们首先获取了触摸传感器的设备ID,然后在initSlots()方法中初始化了触控区域的滑块位置和缩放比例。我们通过监听触摸传感器的ACTION_DOWN、ACTION_MOVE和ACTION_UP事件来实现滑块的滚动和拖拽行为。在ACTION_DOWN事件中,我们根据触摸滑块相对于原坐标位置的相对值进行滑块位置的更新;在ACTION_MOVE事件中,我们按照滑块相对于原坐标位置的实际滑动量进行滑块位置的更新,并检查滑块是否到达滑块末尾,如果是,则清零滑块数值;在ACTION_UP事件中,我们检查滑块是否到达滑块末尾,如果是,则减少滑块数值。

    请注意,这只是一个基本的示例,实际应用可能需要考虑更多的因素,例如触控事件的重叠问题、滑块的位置控制等。在实际项目中,你可能还需要进一步优化触控区域的管理和滑块的具体行为。此外,由于input_mt_init_slots()函数位于主Activity的构造函数内部,因此需要先加载相关的传感器驱动并注册触摸传感器。你可以使用android.hardware.SensorManager类来获取和配置传感器信息,并在onCreateView()方法中进行相关操作。

    评论

报告相同问题?