在 Android Studio 中添加延迟计时器 [英] Add a delay timer in Android Studio

查看:189
本文介绍了在 Android Studio 中添加延迟计时器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

FaceView.java

FaceView.java

        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;
            }

        }

NormalFace.java

NormalFace.java

        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);

            }
        }

HappyFace.java

HappyFace.java

        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 是在画布中显示不同的面部表情.NormalFace.java 和 HappyFace.java 是不同面部表情的 UI.我想在FaceView.java中添加一个延时定时器,这样在定时器倒计时结束后,正常人脸的显示可以变成笑脸.

FaceView.java is to display the different facial expressions in the canvas. The NormalFace.java and HappyFace.java are the UI of the different facial expressions. I want to add a delay timer in FaceView.java so that the display of the normal face can be change to a happy face after the timer had finished counting down.

推荐答案

你可以使用Handler来延迟你的下一个任务

You can use Handler to delay your next task

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

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

30000 is the value of delay in milli seconds which makes it 30 secs

这篇关于在 Android Studio 中添加延迟计时器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆