【问题标题】:AlertDialog with TextView - can't use textView.setText method带有 TextView 的 AlertDialog - 不能使用 textView.setText 方法
【发布时间】:2018-01-07 03:39:04
【问题描述】:

我正在尝试使用自定义视图延迟绘制抛物线。到目前为止,我已经了解到我需要使用 @Override onDraw 方法,但是 1. 我不能使我的抛物线离散,并且 2. 我不知道如何对其进行编程,所以形状是逐步创建的(有延迟)。

我还需要在单击按钮后绘制它,所以这对我来说是另一个复杂因素。现在我正在尝试一步一步地画一条简单的线,但是这个 sn-p 不起作用:

@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();
            }
        }

【问题讨论】:

  • 这感觉有点宽泛。 canvas.drawLine是你目前画抛物线的方法吗?如果是这样,这个图形库中是否有延迟绘制的功能?如果没有,也许您需要找到一个可以为您执行此操作的库。如果您的代码尝试这样做,我建议删除第三个要求(关于按钮点击) - 如果您提出太多帮助请求,您的问题更有可能关闭。一次专注于一件事。
  • 请让这个问题的标题反映它的内容。

标签: android


【解决方案1】:

我可以给你一些技巧,但请你自己完成。

你必须使用计时器来刷新你的组件,如果使用这个,它会每 100 毫秒刷新一次“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);
 ....
}

【讨论】:

  • 我使用 Handler 来等待我的绘图视图结束给定的任务,而且效果很好。至于制作分步动画 - 我创建了一个循环来计算对象在行尾的 y 位置,并用它来创建一个具有可变步距的新路径。如果有人需要,我稍后会发布我的代码。
【解决方案2】:

渲染离散抛物线

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

例如,您可以通过在以下 (x, y) 点绘制一条从x=-1x=1 的抛物线,步长为 1:(-1, 0), (0, 4), (1, 0)

您应该确保在图表上缩放 x 轴的方式是点之间的距离大于 1 像素,以使其看起来离散。

动画onDraw

无论您在 onDraw 中的绘制逻辑是否正确,您都会在 UI 回调上使用 Thread.sleep() 运行长时间操作,这是不好的做法。

由于您是在一次 onDraw 调用中绘制整个抛物线,我会假设整个图像是一次渲染的,而不是动画的。

查看similar question,您应该创建另一个线程来负责您的自定义视图的渲染循环,以创建您绘制每一帧的动画。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多