【问题标题】:Android - How do I get raw touch screen information?Android - 如何获取原始触摸屏信息?
【发布时间】:2011-01-05 07:07:24
【问题描述】:

我正在开发一款适用于 Android 的绘画应用程序,我想使用来自设备触摸屏的原始数据来调整用户绘画时的画笔。我见过其他适用于 Android 的应用程序(例如 iSteam),其中画笔的大小取决于屏幕上指纹的大小。就绘画应用而言,这将是一个巨大的功能。

有没有办法获取这些数据?我已经用谷歌搜索了很长一段时间,但我还没有找到任何证明它的来源。我知道这是可能的,因为 Dolphin Browser 为 Hero 添加了多点触控支持,而无需在应用程序级别下进行任何更改。您必须能够获得原始数据或其他东西的二维矩阵...

如果能得到任何帮助,我将不胜感激!

【问题讨论】:

    标签: android touchscreen multi-touch


    【解决方案1】:

    Motion Event 类中有一些属性。您可以使用getSize() 方法来查找对象的大小。 Motion Event 类还可以访问压力、坐标等...

    【讨论】:

    • 谢谢 - 我会看看这些属性。对 Dolphin 浏览器的多点触控有任何想法吗?
    • 从 2.0 开始,MotionEvent 中也提供多点触控数据。
    • 哇——我没有意识到这一点。谢谢!我的目标是支持 OpenGL 帧缓冲区扩展的 2.0 设备,所以这很完美。
    【解决方案2】:

    如果您查看 SDK 中的 APIDemos,有一个名为 TouchPaint 的简单绘画应用

    package com.example.android.apis.graphics;
    

    它使用以下内容在画布上绘制

    @Override public boolean onTouchEvent(MotionEvent event) {
                int action = event.getAction();
                mCurDown = action == MotionEvent.ACTION_DOWN
                        || action == MotionEvent.ACTION_MOVE;
                int N = event.getHistorySize();
                for (int i=0; i<N; i++) {
                    //Log.i("TouchPaint", "Intermediate pointer #" + i);
                    drawPoint(event.getHistoricalX(i), event.getHistoricalY(i),
                            event.getHistoricalPressure(i),
                            event.getHistoricalSize(i));
                }
                drawPoint(event.getX(), event.getY(), event.getPressure(),
                        event.getSize());
                return true;
            }
    
    private void drawPoint(float x, float y, float pressure, float size) {
                //Log.i("TouchPaint", "Drawing: " + x + "x" + y + " p="
                //        + pressure + " s=" + size);
                mCurX = (int)x;
                mCurY = (int)y;
                mCurPressure = pressure;
                mCurSize = size;
                mCurWidth = (int)(mCurSize*(getWidth()/3));
                if (mCurWidth < 1) mCurWidth = 1;
                if (mCurDown && mBitmap != null) {
                    int pressureLevel = (int)(mCurPressure*255);
                    mPaint.setARGB(pressureLevel, 255, 255, 255);
                    mCanvas.drawCircle(mCurX, mCurY, mCurWidth, mPaint);
                    mRect.set(mCurX-mCurWidth-2, mCurY-mCurWidth-2,
                            mCurX+mCurWidth+2, mCurY+mCurWidth+2);
                    invalidate(mRect);
                }
                mFadeSteps = 0;
            }
    

    希望有帮助:)

    【讨论】:

      【解决方案3】:

      我正在研究类似的东西,我建议也看看CanvasPaint 类。查看 Motion Event 中的 getHistorySize() 也可能有助于了解特定中风的播放时间。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-06
        • 1970-01-01
        • 2012-09-22
        • 1970-01-01
        • 2011-01-17
        相关资源
        最近更新 更多