我正在尝试使用自定义视图延迟绘制抛物线。到目前为止,我已经知道我需要使用@Override onDraw方法,但是1.我不能使我的抛物线离散而且2.我不知道如何编程它以便逐步创建形状(延迟)。
我还需要在点击按钮后绘制它,这对我来说是另一个复杂因素。现在我正在尝试逐步绘制一个简单的行,但这段代码不起作用:
@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();
}
}
答案 0 :(得分:0)
渲染离散抛物线
对于绘制离散抛物线,您应该沿着不同的x和y坐标以更大的步长绘制点(或具有您选择的半径尺寸但以点为中心的圆)。
例如,您可以通过绘制以下(x,y)点来绘制从x=-1
到x=1
的步长为1的抛物线:(-1, 0), (0, 4), (1, 0)
。
您应该确保在图表上缩放x轴的方式,使点之间的距离大于1像素,使其看起来不连续。
动画onDraw
无论onDraw中的绘图逻辑是否正确,您都在UI回调上运行Thread.sleep()的长操作,这是不好的做法。
由于你是在onDraw的一次调用中绘制整个抛物线,我会假设整个图像是一次渲染而不是动画。
查看similar question,您应该创建另一个负责自定义视图渲染循环的线程,以创建绘制每个帧的动画。
答案 1 :(得分:0)
我可以给你一些技巧,但请自己完成。
你必须使用一个计时器来刷新你的组件,如果使用它,它将刷新&#34; onDraw&#34;每100ms。
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++;
}
}
在构造函数
中启动handeler public YOURCOMPONENT(Context context, AttributeSet attrs) {
super(context, attrs);
handler.post(AlarmRunnable);
....
}