我试图用自定义视图绘制一个延迟抛物线。到目前为止,我已经了解到我需要使用@重写onDraw方法,但是1.我不能使抛物线离散,我不知道如何编程,以便逐步创建形状(延迟)。
我还需要在点击按钮后画出来,这对我来说是另一个复杂的问题。现在我正试着一步一步地画一条简单的线,但是这个片段不起作用:
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawPath(path, paint);
int x1 = 10;
int x2 = 100;
int y1 = 10;
int y2 = 100;
int diff = x2-x1;
for (int i = 0; i<diff; i++){
canvas.drawLine(x1, y1, x1+1, y1+1, paint);
x1++;
y1++;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}发布于 2018-01-06 19:39:04
我可以给你一些技巧,但请你自己完成它。
您必须使用计时器来刷新您的组件,如果使用这个,它将每100 it刷新一次"onDraw“。
private Handler handler = new Handler();
private Runnable AlarmRunnable = new Runnable() {
@Override
public void run() {
handler.postDelayed(this, 100);
invalidate();
}
};定义全局变量而不是本地变量。
int cc = 0;
int x1 = 10;
int x2 = 100;
int y1 = 10;
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (cc++ > 100) // STOP HANDLER AFTER COUNTER GETS DONE
handler.removeCallbacks(AlarmRunnable);
System.out.println("CC:" + cc);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStrokeWidth(lineWidth);
paint.setColor(Color.WHITE);
for (int i = 0; i<cc; i++){
canvas.drawLine(x1, y1, x1 + 1, y1 + 1, paint);
x1++;
y1++;
}
}在构造器中启动手柄
public YOURCOMPONENT(Context context, AttributeSet attrs) {
super(context, attrs);
handler.post(AlarmRunnable);
....
}发布于 2018-01-06 19:35:53
呈现离散抛物线
至于画一个离散的抛物线,你应该画点(或圆点的半径大小,但以点为中心)沿着不同的x和y坐标,有更大的步长。
例如,您可以通过在以下(x,y)点绘制一个步长为1的x=-1到x=1的抛物线:(-1, 0), (0, 4), (1, 0)。
你应该确保你在你的图形上缩放你的x轴的方式,是在点之间有超过一个像素的距离,使它看起来是离散的。
动画onDraw
无论onDraw中的绘图逻辑是否正确,您都要在UI回调上使用Thread.sleep()运行长时间操作,这是错误的做法。
因为您是在onDraw的一个调用中绘制整个抛物线,所以我假设整个图像是一次呈现,而不是动画。
查看一个similar question,您应该创建另一个线程,负责自定义视图的呈现循环,以创建一个绘制每个帧的动画。
https://stackoverflow.com/questions/48130655
复制相似问题