跟随触摸输入的绘画轨迹
Paint trail that follows touch input
我正在尝试创建一个在触摸屏幕时播放音乐的音乐板。我也希望有一条跟随用户手指的轨迹。
正如您在图片中看到的那样,我可以在屏幕上绘图,它会随着触摸而变化,但它不会消失,我只剩下一条巨大的彩色线条。
我在 android
中使用油漆 class
这是我用来绘制的代码
public class SingleTouchEventView extends View{
private static final String DEBUG_TAG = "Velocity";
private VelocityTracker mVelocityTracker = null;
public Paint paint = new Paint();
public Path path = new Path();
int sr = 44100;
boolean isRunning = true;
public SingleTouchEventView(Context context, AttributeSet attrs) {
super(context, attrs);
int [] mColors={0xFFFF0000,0xFFFF00FF,0xFF0000FF,0xFF00FFFF,0xFF00FF00,0xFF000000,0xFFFFFFFF,0xFFFFFF00,0xFFFF0000};
Shader s=new SweepGradient(0,0,mColors,null);
paint.setShader(s);
paint.setAntiAlias(true);
paint.setStrokeWidth(6f);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawPath(path, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
case MotionEvent.ACTION_MOVE:
path.lineTo(eventX, eventY);
调用 canvas.drawRGB()
以防 ACTION_UP 使用与您的背景颜色匹配的 RGB 颜色。您需要在 onDraw()
中引用 canvas
有两条路可以走,
II) 简单一:在较短的时间间隔内,将 canvas 与位图或作为此 canvas 原始背景的 canvas 混合。这种混合可以通过在这个 canvas 上绘制背景和一些 alpha 来完成,具体取决于您希望旧像素消失的速度。这是非常低效的,很可能很难看,但是很容易做到。
I) 右一:淡化附加了时间状态的自定义像素路径。将时间数据附加到每个像素或路径,后者更好。为元素的生命周期定义一个 threshold
。使用由增量(现在 - p.time)和阈值计算的密度(alpha 通道)在 canvas 上重新绘制此 pixel/path。 1 - (now - p.time)/threshold
是一个好的开始。请注意,这更难、更高效、更理想、更可调整,而且是正确的做法。
我正在尝试创建一个在触摸屏幕时播放音乐的音乐板。我也希望有一条跟随用户手指的轨迹。
正如您在图片中看到的那样,我可以在屏幕上绘图,它会随着触摸而变化,但它不会消失,我只剩下一条巨大的彩色线条。
我在 android
中使用油漆 class这是我用来绘制的代码
public class SingleTouchEventView extends View{
private static final String DEBUG_TAG = "Velocity";
private VelocityTracker mVelocityTracker = null;
public Paint paint = new Paint();
public Path path = new Path();
int sr = 44100;
boolean isRunning = true;
public SingleTouchEventView(Context context, AttributeSet attrs) {
super(context, attrs);
int [] mColors={0xFFFF0000,0xFFFF00FF,0xFF0000FF,0xFF00FFFF,0xFF00FF00,0xFF000000,0xFFFFFFFF,0xFFFFFF00,0xFFFF0000};
Shader s=new SweepGradient(0,0,mColors,null);
paint.setShader(s);
paint.setAntiAlias(true);
paint.setStrokeWidth(6f);
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawPath(path, paint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
float eventX = event.getX();
float eventY = event.getY();
case MotionEvent.ACTION_MOVE:
path.lineTo(eventX, eventY);
调用 canvas.drawRGB()
以防 ACTION_UP 使用与您的背景颜色匹配的 RGB 颜色。您需要在 onDraw()
有两条路可以走,
II) 简单一:在较短的时间间隔内,将 canvas 与位图或作为此 canvas 原始背景的 canvas 混合。这种混合可以通过在这个 canvas 上绘制背景和一些 alpha 来完成,具体取决于您希望旧像素消失的速度。这是非常低效的,很可能很难看,但是很容易做到。
I) 右一:淡化附加了时间状态的自定义像素路径。将时间数据附加到每个像素或路径,后者更好。为元素的生命周期定义一个 threshold
。使用由增量(现在 - p.time)和阈值计算的密度(alpha 通道)在 canvas 上重新绘制此 pixel/path。 1 - (now - p.time)/threshold
是一个好的开始。请注意,这更难、更高效、更理想、更可调整,而且是正确的做法。