【问题标题】:how to add touch pointer to aplication?如何向应用程序添加触摸指针?
【发布时间】:2016-12-05 11:32:16
【问题描述】:

我正在开发简单的绘图应用程序,我想知道是否可以在触摸画布时添加可见指针?我的意思是类似于PC上的鼠标指示器。这样做的原因是 - 当使用橡皮擦时,您的触摸在哪里注册并且使用指针时不可见,这会有所帮助(特别是在使用手指触摸时,因为笔非常精确)。我尝试过其他类似的主题,但没有一个回答这个问题。

【问题讨论】:

  • 答案是肯定的。
  • 标题问题的答案呢?
  • 你说“我试过了”。告诉我们。
  • 我试过搜索...我没有编写任何代码,因为没有一个类似的问题有答案。我认为这从句子的以下部分很明显。

标签: java android pointers touch


【解决方案1】:

取自这篇文章: How to programmatically enable "show touches" option in Android?

• 启用显示触摸:

Settings.System.putInt(context.getContentResolver(),
            "show_touches", 1);

• 禁用显示触摸:

Settings.System.putInt(context.getContentResolver(),
            "show_touches", 0);

记得将 android.permission.WRITE_SETTINGS 添加到您的 Manifest。

编辑:

这里是一个DrawView.java,它实现了 View.OnTouchListener 并定义了多种绘制模式。但是它缺乏指标。

在 DrawView 的 setListener 内的主要活动中,您覆盖 onStartDrawing 方法:在这里您可以决定是否显示指示器以及如何根据 DrawView 的当前模式(笔、橡皮擦等)和其他界面方法设置样式指示器是否可见并在绘图结束时将其隐藏。检查代码:

            mDrawView.setOnDrawViewListener(new DrawView.OnDrawViewListener() {
                @Override public void onStartDrawing() {
                    canUndoRedo();
                    // decide whether or not to show an
                    // indicator and style it depending on
                    // mDrawView's attributes and current drawing mode

                    setIndicator(mDrawView.getDrawingMode(),mDrawView.getDrawWidth());
                }

                @Override
                public void onMove(MotionEvent motionEvent) {
                    if(isIndicatorVisible){
                        indicatorView.animate()
                                .x(motionEvent.getX())
                                .y(motionEvent.getY())
                                .setDuration(0)
                                .start();
                    }

                }

                @Override public void onEndDrawing() {
                    canUndoRedo();
                    //hide indicator here
                    if (isIndicatorVisible){
                        indicatorView.setVisibility(View.GONE);
                        isIndicatorVisible = false;

                    }

                }

这是我添加到 DrawView.java 的编辑:

定义了新的接口方法void onMove(MotionEvent motionEvent)

  public interface OnDrawViewListener {
        void onStartDrawing();

        void onEndDrawing();

        void onClearDrawing();

        void onRequestText();

        void onMove(MotionEvent motionEvent); // added this method
    }

在 onToch 内部调用新方法:

    case MotionEvent.ACTION_MOVE:
                onDrawViewListener.onMove(motionEvent); // added this line
                mDrawMoveHistory.get(mDrawMoveHistory.size() - 1).setEndX(motionEvent.getX()).setEndY(motionEvent.getY());

                if (mDrawingTool == DrawingTool.PEN || mDrawingMode == DrawingMode.ERASER) {
                    mDrawMoveHistory.get(mDrawMoveHistory.size() - 1).getDrawingPathList()
                            .get(mDrawMoveHistory.get(mDrawMoveHistory.size() - 1).getDrawingPathList().size() - 1)
                            .lineTo(motionEvent.getX(), motionEvent.getY());
                }
                invalidate();
                break;

这里是 setIndicator 方法:

    private void setIndicator(DrawingMode drawingMode, int drawWidth) {
        if (drawingMode == DrawingMode.ERASER){
            RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(drawWidth, drawWidth);
            indicatorView.setLayoutParams(params);
            GradientDrawable border = new GradientDrawable();
            border.setStroke(1, 0xFF000000); //black border with full opacity
            if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
                indicatorView.setBackgroundDrawable(border);
            } else {
                indicatorView.setBackground(border);
            }
            indicatorView.setVisibility(View.VISIBLE);
            isIndicatorVisible = true;
        }
    }

【讨论】:

  • 我之前看过这篇文章,但这并不完全是我需要的,但可以肯定的是我已经用我的代码尝试过了。它仅作为一种解决方法起作用,因为我得到了我触摸的位置的轮廓。我要求的是一个指针,它可以像它的大小一样绘制/擦除(已经涵盖了绘制/擦除)。而且我只希望它在画布上,因为在工具箱或其他任何地方它都是无用的。
  • 另一个问题是这似乎只适用于 API
  • 我编辑了答案.. 代码基于这个 github 项目:github.com/ByoxCode/DrawView.. 我尝试了我所做的更改,它工作正常.. 祝你好运
  • 谢谢,这看起来很棒而且很有用,但我似乎需要你的更多帮助。我试图让它尽可能简单,看看它是否有效。我制作了简单的视图(存储在drawingView所在的相同布局中)。我从 onTouchEvent 中的 drawingView 调用它(告诉我是否有更好的方法): if (pointer == null) { pointer = ((MainActivity) context).getPointer();接下来,我使用了与 onMove 相同的内容,并将其用于 MotionEvent.ACTION_MOVE: No errors or exceptions,app 工作正常,只是没有指示符。有什么帮助吗?
  • 杀了我!为了测试目的,我做了很多更改,但我忘记了我已经从我的视图中删除了 android:src。所以基本上我是在为鬼制作动画 :D 成功,但仍然是鬼。谢谢!
猜你喜欢
  • 2012-10-29
  • 2011-06-07
  • 2016-04-11
  • 2011-04-26
  • 1970-01-01
  • 2015-06-14
  • 1970-01-01
  • 1970-01-01
  • 2015-06-08
相关资源
最近更新 更多