有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在Android Studio中添加延迟计时器

FaceView。爪哇

        package com.example.richelle.neeuro;
        public class FaceView extends View {
            private float radius;
            NormalFace normalFace;
            HappyFace happyFace;

            public FaceView(Context context, AttributeSet attrs) {
                super(context, attrs);

                // get radius value
                TypedArray a = context.getTheme().obtainStyledAttributes(
                        attrs,
                        R.styleable.FaceView,
                        0, 0
                );

                try {
                    radius = a.getDimension(R.styleable.FaceView_radius, 20.0f);
                } finally {
                    a.recycle();
                }

                // initiate HappyFace class
                normalFace = new NormalFace(radius);
                happyFace = new HappyFace(radius);
            }

            Handler setDelay;
            Runnable startDelay;

            @Override
            protected void onDraw(final Canvas canvas) {
                super.onDraw(canvas);
                normalFace.draw(canvas);
                //delay timer
                setDelay = new Handler();
                startDelay = new Runnable() {
                    @Override
                    public void run() {
                        happyFace.draw(canvas);
                    }
                };
                setDelay.postDelayed(startDelay,5000);
            }

            @Override
            protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);

                int desiredWidth = (int) radius*2+(int) Math.ceil((radius/1.70));
                int desiredHeight = (int) radius*2+(int)Math.ceil((radius/1.70));

                int widthMode = MeasureSpec.getMode(widthMeasureSpec);
                int widthSize = MeasureSpec.getSize(widthMeasureSpec);
                int heightMode = MeasureSpec.getMode(heightMeasureSpec);
                int heightSize = MeasureSpec.getSize(heightMeasureSpec);

                int width;
                int height;

                //Measure Width
                if (widthMode == MeasureSpec.EXACTLY) {
                    //Must be this size
                    width = widthSize;
                } else if (widthMode == MeasureSpec.AT_MOST) {
                    //Can't be bigger than...
                    width = Math.min(desiredWidth, widthSize);
                    Log.d("Width AT_MOST", "width: "+width);
                } else {
                    //Be whatever you want
                    width = desiredWidth;
                    Log.d("Width ELSE", "width: "+width);

                }

                //Measure Height
                if (heightMode == MeasureSpec.EXACTLY) {
                    //Must be this size
                    height = heightSize;
                } else if (heightMode == MeasureSpec.AT_MOST) {
                    //Can't be bigger than...
                    height = Math.min(desiredHeight, heightSize);
                } else {
                    //Be whatever you want
                    height = desiredHeight;
                }

                //MUST CALL THIS
                setMeasuredDimension(width, height);
            }
            public float getRadius() {
                return radius;
            }

            public void setRadius(float radius) {
                this.radius = radius;
            }

        }

正常脸。爪哇

        public class NormalFace {

            //Paint object
            Paint facePaint;
            Paint mePaint;

            float radius;
            float adjust;

            float mouthLeftX, mouthRightX, mouthTopY, mouthBottomY;
            RectF mouthRectF;
            Path mouthPath;

            float eyeLeftX, eyeRightx, eyeTopY, eyeBottomY;
            RectF eyeLeftRectF, eyeRightRectF;

            public NormalFace(float radius){
                this.radius= radius;

                facePaint = new Paint();
                facePaint.setColor(0xfffed325); // face color - yellow
                facePaint.setDither(true);
                facePaint.setStrokeJoin(Paint.Join.ROUND);
                facePaint.setStrokeCap(Paint.Cap.ROUND);
                facePaint.setPathEffect(new CornerPathEffect(10) );
                facePaint.setAntiAlias(true);
                facePaint.setShadowLayer(4, 2, 2, 0x80000000);

                mePaint = new Paint();
                mePaint.setColor(0xff2a2a2a); //black
                mePaint.setDither(true);
                mePaint.setStyle(Paint.Style.STROKE);
                mePaint.setStrokeJoin(Paint.Join.ROUND);
                mePaint.setStrokeCap(Paint.Cap.ROUND);
                mePaint.setPathEffect(new CornerPathEffect(10) );
                mePaint.setAntiAlias(true);
                mePaint.setStrokeWidth(radius / 14.0f);

                adjust = radius / 3.2f;

                // Left Eye
                eyeLeftX = radius-(radius*0.43f);
                eyeRightx = eyeLeftX + (radius*0.3f);
                eyeTopY = radius-(radius*0.5f);
                eyeBottomY = eyeTopY + (radius*0.4f);

                eyeLeftRectF = new RectF(eyeLeftX+adjust,eyeTopY+adjust,eyeRightx+adjust,eyeBottomY+adjust);

                // Right Eye
                eyeLeftX = eyeRightx + (radius*0.3f);
                eyeRightx = eyeLeftX + (radius*0.3f);

                eyeRightRectF = new RectF(eyeLeftX+adjust,eyeTopY+adjust,eyeRightx+adjust,eyeBottomY+adjust);

                // Mouth
                mouthLeftX = radius-(radius/2.0f);
                mouthRightX = mouthLeftX+ radius;
        //        mouthTopY = 125 - (125*0.01f);
        //        mouthBottomY = mouthTopY + (125*0.01f);
                mouthTopY = radius - (radius*(-0.2f));
                mouthBottomY = mouthTopY + (radius*0.01f);

                mouthRectF = new RectF(mouthLeftX+adjust,mouthTopY+adjust,mouthRightX+adjust,mouthBottomY+adjust);
                //mouthRectF = new RectF(mouthLeftX+adjust,mouthTopY+70,mouthRightX+adjust,mouthBottomY+20); //a line

                mouthPath = new Path();

                mouthPath.arcTo(mouthRectF, 30, 120, true);
        //        mouthPath.arcTo(mouthRectF, 15, 135, true);
            }

            public void draw(Canvas canvas) {

                // 1. draw face
                canvas.drawCircle(radius+adjust, radius+adjust, radius, facePaint);

                // 2. draw mouth
                mePaint.setStyle(Paint.Style.STROKE);

                canvas.drawPath(mouthPath, mePaint);
                //canvas.drawLine(90, 155, 176, 155, mePaint);

                // 3. draw eyes
                mePaint.setStyle(Paint.Style.FILL);
                canvas.drawArc(eyeLeftRectF, 0, 360, true, mePaint);
                canvas.drawArc(eyeRightRectF, 0, 360, true, mePaint);

            }
        }

快乐脸。爪哇

        public class HappyFace {

            //Paint object
            Paint facePaint;
            Paint mePaint;

            float radius;
            float adjust;

            float mouthLeftX, mouthRightX, mouthTopY, mouthBottomY;
            RectF mouthRectF;
            Path mouthPath;

            float eyeLeftX, eyeRightx, eyeTopY, eyeBottomY;
            RectF eyeLeftRectF, eyeRightRectF;

            public HappyFace(float radius){
                this.radius= radius;

                facePaint = new Paint();
                facePaint.setColor(0xfffed325); // face color - yellow
                facePaint.setDither(true);
                facePaint.setStrokeJoin(Paint.Join.ROUND);
                facePaint.setStrokeCap(Paint.Cap.ROUND);
                facePaint.setPathEffect(new CornerPathEffect(10) );
                facePaint.setAntiAlias(true);
                facePaint.setShadowLayer(4, 2, 2, 0x80000000);

                mePaint = new Paint();
                mePaint.setColor(0xff2a2a2a); //black
                mePaint.setDither(true);
                mePaint.setStyle(Paint.Style.STROKE);
                mePaint.setStrokeJoin(Paint.Join.ROUND);
                mePaint.setStrokeCap(Paint.Cap.ROUND);
                mePaint.setPathEffect(new CornerPathEffect(10) );
                mePaint.setAntiAlias(true);
                mePaint.setStrokeWidth(radius / 14.0f);

                adjust = radius / 3.2f;

                // Left Eye
                eyeLeftX = radius-(radius*0.43f);
                eyeRightx = eyeLeftX + (radius*0.3f);
                eyeTopY = radius-(radius*0.5f);
                eyeBottomY = eyeTopY + (radius*0.4f);

                eyeLeftRectF = new RectF(eyeLeftX+adjust,eyeTopY+adjust,eyeRightx+adjust,eyeBottomY+adjust);

                // Right Eye
                eyeLeftX = eyeRightx + (radius*0.3f);
                eyeRightx = eyeLeftX + (radius*0.3f);

                eyeRightRectF = new RectF(eyeLeftX+adjust,eyeTopY+adjust,eyeRightx+adjust,eyeBottomY+adjust);


                // Smiley Mouth
                mouthLeftX = radius-(radius/2.0f);
                mouthRightX = mouthLeftX+ radius;
                mouthTopY = radius - (radius*0.2f);
                mouthBottomY = mouthTopY + (radius*0.5f);

                mouthRectF = new RectF(mouthLeftX+adjust,mouthTopY+adjust,mouthRightX+adjust,mouthBottomY+adjust);
                mouthPath = new Path();

                mouthPath.arcTo(mouthRectF, 30, 120, true);
            }

            public void draw(Canvas canvas) {

                // 1. draw face
                canvas.drawCircle(radius+adjust, radius+adjust, radius, facePaint);

                // 2. draw mouth
                mePaint.setStyle(Paint.Style.STROKE);

                canvas.drawPath(mouthPath, mePaint);

                // 3. draw eyes
                mePaint.setStyle(Paint.Style.FILL);
                canvas.drawArc(eyeLeftRectF, 0, 360, true, mePaint);
                canvas.drawArc(eyeRightRectF, 0, 360, true, mePaint);

            }
        }

FaceView。java将在画布中显示不同的面部表情。正常人的脸。java和HappyFace。java是不同面部表情的UI。我想在FaceView中添加一个延迟计时器。java,以便在计时器完成倒计时后,可以将正常人脸的显示更改为快乐人脸


共 (3) 个答案

  1. # 1 楼答案

    您可以使用Handler延迟下一个任务

    import android.os.Handler;
        Handler handler=new Handler();
                    Runnable r=new Runnable() {
                        public void run() {
                            // Your next task
                        }
                    };
                    handler.postDelayed(r, 30000);
    

    30000是以毫秒为单位的延迟值,即30秒

  2. # 2 楼答案

    你可以使用Handler类来处理这个问题,因为android.Handler有一个方法postDelayed(),你可以使用这个方法来延迟,阅读here中的处理程序

     Runnable happy = new Runnable() {
    public void run() {
        happyFace(); //suppose this is the method for happy face
    }
    };
    

    然后在5秒后像这样调用这个方法

     handler.postDelayed(happy,5000);
    

    它会在5秒后发布你的代码

  3. # 3 楼答案

    使用这个:毫秒是以毫秒为单位的延迟

    try {
            Thread.sleep(ms);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }