gpt4 book ai didi

java - Android Canvas : make a drawn line fade/alphaAnimation away on touch

转载 作者:行者123 更新时间:2023-12-01 15:42:07 25 4
gpt4 key购买 nike

我有一个Canvas,我在onTouchEvent()中的点之间绘制线条。当用户对放置线条的位置做出无效选择时,我会绘制一条红线而不是黑色线。不过我希望红线在接下来的 500-1000 毫秒内消失。

我还不知道如何做到这一点,甚至不知道是否可以在 Canvas 内为单行设置动画。

我已将点、有效黑线和无效红线分割在我的 3 个不同位图之间:

public void onDraw(Canvas canvas) {
// Fade Red Line
canvas.drawBitmap(fBitmap, 0, 0, null);
// Lines
canvas.drawBitmap(mBitmap, 0, 0, null);
// Dots
canvas.drawBitmap(iBitmap, 0, 0, null);
}

在我的 onTouch 函数中是我的 drawLines()

我想知道是否可以使用 AlphaAnimation 来实现此目的,或者是否必须使用计时器系统来循环 fBitmap 以及我想要随时间淡出的红线。

有什么想法吗?

编辑:好吧,这是我一年后回来后最终解决它的方法:

我实现了一个SurfaceView并创建了一个线程来不断更新Canvas。

@Override
public void run() {
while (isRunning) {
if (!surfaceHolder.getSurface().isValid()) {
continue;
}

decreaseLineOpacity();
drawLinesInvalid();

/* Other things to draw*/

Canvas canvas = surfaceHolder.lockCanvas();

canvas.drawBitmap(fBitmap, centerPointWidth, centerPointHeight, null);
// mBitmap is the middleground with the line that fades away.
// and is bound to mCanvas for drawing
canvas.drawBitmap(mBitmap, centerPointWidth, centerPointHeight, null);
canvas.drawBitmap(iBitmap, centerPointWidth, centerPointHeight, null);

surfaceHolder.unlockCanvasAndPost(canvas);
}
}

然后是负责更改不透明度和绘制线条的方法,我将绘制的每条线存储在队列中,直到其不透明度达到 0,然后将其删除,以便仅需要绘制线条剩下动画:

    private void drawLinesInvalid() {
Iterator<int[]> iterator = invalidLines.iterator();
// Loop through each element in the Queue, delete it from the bitmap with the porter
// duff mode to keep the transparancy of the layer. Then draw line with the given opacity
while (iterator.hasNext()) {
int[] invalidLine = iterator.next();
float[] line = {invalidLine[1], invalidLine[2], invalidLine[3], invalidLine[4]};
Xfermode originalXfermode = paint.getXfermode();
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
mCanvas.drawLines(line, paint);
paint.setXfermode(originalXfermode);

paint.setColor(Color.RED);
paint.setAlpha(invalidLine[0]);

mCanvas.drawLines(line, paint);

}
}

// Call this function in the onTouch method
private void addLineToInvalidList(float[] line) {
// Store each line a queue with its current opacity
int[] lineWithOpacity = new int[5];
lineWithOpacity[0] = 250;
lineWithOpacity[1] = (int) line[0];
lineWithOpacity[2] = (int) line[1];
lineWithOpacity[3] = (int) line[2];
lineWithOpacity[4] = (int) line[3];
invalidLines.add(lineWithOpacity);
}

private void decreaseLineOpacity() {
Iterator<int[]> iterator = invalidLines.iterator();
// Remove all lines that are finished animating (opacity = 0)
while (iterator.hasNext()) {
int[] line = iterator.next();
if (line[0] == 0) {
iterator.remove();
}
}

// Decrease opacity on lines that are left
iterator = invalidLines.iterator();
while (iterator.hasNext()) {
int[] line = iterator.next();
line[0] -= 10;
}
}

最佳答案

考虑到您要在同一 View 上绘制所有三个位图,使用 AlphaAnimation 可能有点棘手。

我建议生成一个线程,随着时间的推移更改无效红线位图的 alpha 值(使用 Thread.sleep hibernate 设定的时间间隔)。但是,为了使其表现良好,您应该考虑使用 SurfaceView,因为多次调用 postInvalidate 的成本可能相当高(除非它在具有硬件加速的 Android 3.0+ 上运行) .

关于java - Android Canvas : make a drawn line fade/alphaAnimation away on touch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7891109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com