Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android画布中的onDraw()中添加延迟?_Java_Android_Canvas_Delay_Ondraw - Fatal编程技术网

Java 如何在android画布中的onDraw()中添加延迟?

Java 如何在android画布中的onDraw()中添加延迟?,java,android,canvas,delay,ondraw,Java,Android,Canvas,Delay,Ondraw,我正在做一个项目。它在android画布中绘制同心圆。当用户拖动屏幕时,所有圆圈都会相应移动。这是到目前为止我的代码 activity_main.xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res

我正在做一个项目。它在android画布中绘制同心圆。当用户拖动屏幕时,所有圆圈都会相应移动。这是到目前为止我的代码

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:background="@android:color/white">

        <RelativeLayout
        android:id="@+id/scrollableSpace"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true">

        <project.myProject.DrawOrbit
            android:id="@+id/orbitsRegion"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:layout_alignParentTop="true"
            android:layout_alignParentLeft="true" />


    </RelativeLayout>
</RelativeLayout>
DrawOrbit.java

public class DrawOrbit extends View
{
    PointF center;
    float radius[];
    public DrawOrbit(Context context) {
        super(context);
    }

    public DrawOrbit(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public DrawOrbit(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
        paint.setColor(Color.BLACK);

        paint.setStrokeWidth(2);
        paint.setStyle(Paint.Style.STROKE);
        int len=radius.length;
        for(int a=0;a<len;a++)
        {
            canvas.drawCircle(center.x,center.y,radius[a],paint);
        }
    }   

    public void draw(PointF center, float radius[])
    {
        this.center=center;
        this.radius=radius;
        invalidate();        
        requestLayout();
    }
}
public class DrawOrbit extends View
{
    PointF center;
    float radius[];
    int index;
    public DrawOrbit(Context context) {
        super(context);
    }

    public DrawOrbit(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public DrawOrbit(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas)
    {
        super.onDraw(canvas);
        paint.setColor(Color.BLACK);

        paint.setStrokeWidth(2);
        paint.setStyle(Paint.Style.STROKE);
        int len=radius.length;
        for(int a=0;a<index;a++)
        {
            canvas.drawCircle(center.x,center.y,radius[a],paint);
        }
    }   

    public void draw(PointF center, float radius[],int index)
    {
        this.center=center;
        this.radius=radius;
        this.index=index;
        invalidate();        
        requestLayout();
    }
}
公共类DrawOrbit扩展视图
{
PointF中心;
浮动半径[];
公共DrawOrbit(上下文){
超级(上下文);
}
公共DrawOrbit(上下文上下文,@Nullable AttributeSet attrs){
超级(上下文,attrs);
}
公共DrawOrbit(上下文上下文,@Nullable AttributeSet attrs,int-defStyleAttr){
super(上下文、attrs、defStyleAttr);
}
@凌驾
受保护的void onDraw(画布)
{
super.onDraw(帆布);
油漆。设置颜色(颜色。黑色);
油漆。设置行程宽度(2);
绘制.设置样式(绘制.样式.笔划);
int len=半径。长度;

对于(int a=0;a您正在寻找的是一个超时。我建议创建一个新线程来绘制所有内容,并从绘制第一个圆开始,方法如下所示:

public void drawCircle() {
    //Draw logic
    TimeUnit.SECONDS.sleep(3);
    drawNextCircle();
}
//Assuming on java 1.8+
Thread thread = new Thread() => {
    drawCircle();
}
这将使线程休眠3秒,然后在时间段结束后继续正常操作。您可以将其更改为其他时间度量,例如
TimeUnit.millides
TimeUnit.MINUTES

编辑:您可能不希望在主线程中使用此功能,因为无论您将线程超时多长时间,它都会停止整个应用程序的工作,因此,将其放在单独的线程中几乎是必不可少的


编辑2:在timeout中添加一个单独的util方法,然后通过反射调用另一个方法比上面的代码更有意义,但是需要相同的代码。

找到了我自己问题的答案。我必须使用一个处理程序,将延迟乘以for循环变量,然后取1,然后取2,依此类推。.循环得到d红色效果。这是代码

MainActivity.java

public class MainActivity extends AppCompatActivity implements View.OnTouchListener
{
    PointF center;
    center.x=500;center.y=500;
    float radius[]={100,200,300,400,500};
    DrawOrbit orbit;
    int startX=0,startY=0,currentX=0,currentY=0;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RelativeLayout layout=(RelativeLayout)findViewById(R.id.scrollableSpace);
        orbit.draw(center,radius);

        layout.setOnTouchListener(this);
    }   


    @Override
    public boolean onTouch(View v, MotionEvent motionEvent)
    {

        final int action= motionEvent.getAction();
        switch(action & MotionEvent.ACTION_MASK)
        {
            case MotionEvent.ACTION_DOWN:
            {              
                startX=(int)motionEvent.getRawX();
                startY=(int)motionEvent.getRawY();             

                break;
            }
            case MotionEvent.ACTION_MOVE:
            {
                currentX=(int)motionEvent.getRawX();
                currentY=(int)motionEvent.getRawY();               

                float diffX=currentX-startX;
                float diffY=currentY-startY;

                startX=currentX;
                startY=currentY;

                center.x+=diffX;
                center.y+=diffY;
                orbit.draw(center,radius);

                break;
            }          

        }
        return true;

    }
}
public class MainActivity extends AppCompatActivity implements View.OnTouchListener
{
    PointF center;
    center.x=500;center.y=500;
    float radius[]={100,200,300,400,500};
    DrawOrbit orbit;
    int startX=0,startY=0,currentX=0,currentY=0;
    Handler handler1 = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RelativeLayout layout=(RelativeLayout)findViewById(R.id.scrollableSpace);
        for (int a = 0; a<radius.length ;a++)
        {
            final int index=a;
            handler1.postDelayed(new Runnable() {

                @Override
                public void run() {
                    orbit.draw(center,radius,index);
                }
            }, 300 * a);
        }

        layout.setOnTouchListener(this);
    }   


    @Override
    public boolean onTouch(View v, MotionEvent motionEvent)
    {

        final int action= motionEvent.getAction();
        switch(action & MotionEvent.ACTION_MASK)
        {
            case MotionEvent.ACTION_DOWN:
            {              
                startX=(int)motionEvent.getRawX();
                startY=(int)motionEvent.getRawY();             

                break;
            }
            case MotionEvent.ACTION_MOVE:
            {
                currentX=(int)motionEvent.getRawX();
                currentY=(int)motionEvent.getRawY();               

                float diffX=currentX-startX;
                float diffY=currentY-startY;

                startX=currentX;
                startY=currentY;

                center.x+=diffX;
                center.y+=diffY;

                break;
            } 
            case MotionEvent.ACTION_UP:
            {
                for (int a = 0; a<radius.length ;a++)
                {
                    final int index=a;
                    handler1.postDelayed(new Runnable() {

                        @Override
                        public void run() {
                            orbit.draw(center,radius,index);
                        }
                    }, 300 * a);
                }
                break;
            }

        }
        return true;

    }
}
public类MainActivity扩展了AppCompatActivity实现了View.OnTouchListener
{
PointF中心;
中心x=500;中心y=500;
浮动半径[]={100200300400500};
牵引轨道;
int startX=0,startY=0,currentX=0,currentY=0;
Handler handler1=新的Handler();
@凌驾
创建时受保护的void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
RelativeLayout布局=(RelativeLayout)findViewById(R.id.scrollableSpace);

对于(inta=0;aCan),请给出一点详细的代码。我对这个很陌生。谢谢