带有TextView的AlertDialog - 无法使用textView.setText方法

时间:2018-01-06 18:44:41

标签: android

我正在尝试使用自定义视图延迟绘制抛物线。到目前为止,我已经知道我需要使用@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();
            }
        }

2 个答案:

答案 0 :(得分:0)

渲染离散抛物线

对于绘制离散抛物线,您应该沿着不同的x和y坐标以更大的步长绘制点(或具有您选择的半径尺寸但以点为中心的圆)。

例如,您可以通过绘制以下(x,y)点来绘制从x=-1x=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);
 ....
}