Android实现手势检测

本文介绍了一个基于Android平台的手势识别应用程序实现过程。该应用通过GestureOverlayView组件捕捉用户手势,并将其转换为图片进行保存。此外,还实现了从本地文件加载已保存的手势,并通过比较识别用户的新手势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果图

这里写图片描述

代码

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();
                }
            }
        });
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值