在自定义视图中添加触摸效果 - Android

Adding touch effect in custom View - Android

我创建了一个自定义 View,里面有一段文字:

canvas.drawText(text,
            bounds.centerX(),
            _getTextVerticalCenterPosition(bounds, paint),
            paint);

_getTextVerticalCenterPosition 只是 return 的 y 位置。

现在开始触摸 (onTouchEvent) 我想设置任何效果让用户在视觉上感受到触摸但不知道从哪里开始。 MotionEvent.ACTION_DOWN 应该启动效果,MotionEvent.ACTION_UP 应该结束效果,return 文本恢复到初始外观。 "sliding" 屏幕上的手指呢?如果文本的初始外观是 return 在手指离开边界之后而不是在 MotionEvent.ACTION_UP.

之后编辑,那就太好了
@Override
public boolean onTouchEvent(MotionEvent event)
{
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            if (bounds.contains(x, y)) {
                // Text pressed

            }
        }
    }
    return true;
}

或者是否可以在我的自定义视图中使用基本视图,例如 Button,并将它们与圆弧和路径结合起来?


解决方法:

@Override
public boolean onTouchEvent(MotionEvent event)
{
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            if (bounds.contains(x, y)) {
                // Text pressed
                _setTextColor(mOnTouchColor);
                invalidate();
            }
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            _setTextColor(mColor);
            invalidate();
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            // Finger off the bounds
            if (!bounds.contains(x, y)) {
                _setTextColor(mColor);
                invalidate();
            }
            break;
        }
    }
    return true;
}

您可以使用 onTouch 来解决这个问题,这里重要的一件事是调用 invalidate() - 告诉视图用新数据重新绘制自身

@Override
public boolean onTouchEvent(MotionEvent event)
{
    float x = event.getX();
    float y = event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            if (bounds.contains(x, y)) {
                // Text pressed
                // Change paint, text size or what ever
                invalidate();
            }
        }
       case MotionEvent.ACTION_UP:
              // Apply original paint, size, ..
              invalidate();
    }
    return true;
}