Android实现手势检测

效果图

这里写图片描述

代码

public class MainActivity extends AppCompatActivity{
    private static final String TAG = "MainActivity";
    private GestureOverlayView overlayview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        overlayview = (GestureOverlayView) findViewById(R.id.gestureoverlayview);
        overlayview.setGestureStrokeWidth(8);
        overlayview.setGestureColor(Color.GREEN);
        //添加手势完成时监听
        overlayview.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
            @Override
            public void onGesturePerformed(GestureOverlayView overlay, final Gesture gesture) {
                View view = getLayoutInflater().inflate(R.layout.dialog_save_gesture,null);
                ImageView iv = (ImageView) view.findViewById(R.id.iv_geture);
                final EditText et = (EditText) view.findViewById(R.id.et);
//                把手势转化为图片,此处的颜色必须带透明度,否则图片无法显示
                Bitmap bitmap = gesture.toBitmap(128, 128, 5, 0xffff0000);
                iv.setImageBitmap(bitmap);
                new AlertDialog.Builder(MainActivity.this).setView(view)
                        .setNegativeButton("取消", new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {

                            }
                        }).setPositiveButton("保存", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        //创建保存手势文件的文件
                        File dir = new File(Environment.getExternalStorageDirectory(),"gesture");
                        if(!dir.exists()){
                            dir.mkdirs();
                        }
                        File file = new File(dir,"gestures");
                        if(!file.exists()){
                            try {
                                file.createNewFile();
                            } catch (IOException e) {
                                e.printStackTrace();
                            }
                        }
                        GestureLibrary gestureLibrary = GestureLibraries.fromFile(file);
                        //添加手势名称并保存
                        gestureLibrary.addGesture(et.getText().toString(),gesture);
                        gestureLibrary.save();
                    }
                }).show();
            }
        });
    }
    public void startSecond(View view){
        Intent intent = new Intent(this,SecondActivity.class);
        startActivity(intent);
    }
}
public class SecondActivity extends AppCompatActivity {

    private GestureLibrary gestureLibrary;
    private GestureOverlayView overlayView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
        File dir = new File(Environment.getExternalStorageDirectory(),"gesture");
        File file = new File(dir,"gestures");
         gestureLibrary = GestureLibraries.fromFile(file);
        //从指定文件加载手势
        if(gestureLibrary.load()){
            Toast.makeText(this,"加载成功",Toast.LENGTH_SHORT).show();
        }else{
            Toast.makeText(this,"加载失败",Toast.LENGTH_SHORT).show();
        }
        overlayView = (GestureOverlayView) findViewById(R.id.gestureoverlayview);
        overlayView.setGestureColor(Color.GREEN);
        overlayView.setGestureStrokeWidth(5);
        overlayView.addOnGesturePerformedListener(new GestureOverlayView.OnGesturePerformedListener() {
            @Override
            public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
                //获取识别到的手势集合
                ArrayList<Prediction> predictions = gestureLibrary.recognize(gesture);
                ArrayList<String> result = new ArrayList<String>();
                for (Prediction pre:predictions){
                    if(pre.score>2.0){
                        result.add("与手势【"+pre.name+"】相似度为"+pre.score);
                    }
                }
                if (result.size() >0) {
                    ArrayAdapter<String> adapter = new ArrayAdapter<String>(SecondActivity.this,
                            android.R.layout.simple_list_item_1,result);
                    new AlertDialog.Builder(SecondActivity.this).setAdapter(adapter,null)
                            .setPositiveButton("确定",null).show();
                } else {
                    Toast.makeText(SecondActivity.this,"无法找到匹配的手势",Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 应用程序中实现旋转和拖动手势,可以使用 GestureDetector 和 ScaleGestureDetector 类。这两个类都是 Android SDK 中的标准类,用于检测用户的手势。 下面是一个简单的示例代码,演示如何使用 GestureDetector 和 ScaleGestureDetector 实现旋转和拖动手势: ```java public class MainActivity extends AppCompatActivity { private ImageView imageView; private float scaleFactor = 1.0f; private float rotationDegrees = 0.f; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = findViewById(R.id.imageView); // 设置双指缩放手势监听器 ScaleGestureDetector scaleGestureDetector = new ScaleGestureDetector(this, new ScaleGestureDetector.SimpleOnScaleGestureListener() { @Override public boolean onScale(ScaleGestureDetector detector) { scaleFactor *= detector.getScaleFactor(); imageView.setScaleX(scaleFactor); imageView.setScaleY(scaleFactor); return true; } }); // 设置单指旋转手势监听器 final GestureDetector gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { rotationDegrees -= distanceX; imageView.setRotation(rotationDegrees); return true; } }); // 设置 ImageView 触摸事件监听器,用于将手势事件传递给上面的手势监听器 imageView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { scaleGestureDetector.onTouchEvent(event); gestureDetector.onTouchEvent(event); return true; } }); } } ``` 在这个示例中,我们创建了一个 ImageView,用于演示手势操作的效果。然后我们创建了一个 ScaleGestureDetector 和 GestureDetector 实例,并将它们分别用于监听双指缩放和单指旋转手势。 最后,我们将 ImageView 的触摸事件传递给上面的手势监听器,以便检测用户的手势操作。当检测手势操作时,我们通过修改 ImageView 的缩放和旋转属性来实现旋转和拖动操作。 请注意,这只是一个简单的示例代码,实际应用中还需要对手势操作进行更多的处理和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值