android 自定义View(3)圆形View 加速条

分析加速条 一个圆环两种颜色, 加速的速度 圆环的宽度

firstColor

secondColor

speed

circleWidth;

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <attr name="firstColor" format="color"></attr>
    <attr name="secondColor" format="color"></attr>
    <attr name="circleWidth" format="dimension"></attr>
    <attr name="speed" format="integer"></attr>

    <declare-styleable name="CustomProgress">
        <attr name="firstColor"></attr>
        <attr name="secondColor"></attr>
        <attr name="circleWidth"></attr>
        <attr name="speed"></attr>
    </declare-styleable>

</resources>
package com.zhy.customview02;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;

public class CustomProgress extends View {
    /**
     * 第一圈颜色
     */
    private int firstColor;
    /**
     * 第二圈颜色
     */
    private int secondColor;
    /**
     * 圆的宽度
     */
    private int circleWidth;
    /**
     * 速度
     */
    private int speed;
    /**
     * 当前的进度
     */
    private int curProgress;
    /**
     * 画笔
     */
    private Paint mPaint;

    boolean isNext = false;

    public CustomProgress(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomProgress, defStyle, 0);
        initView(typedArray);
    }
    public CustomProgress(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public CustomProgress(Context context) {
        super(context, null);
    }

    public void initView(TypedArray typedArray){
        int n = typedArray.getIndexCount();
        for (int i = 0; i < n; i++) {
            int attr = typedArray.getIndex(i);
            switch (attr) {
            case R.styleable.CustomProgress_firstColor:
                firstColor = typedArray.getColor(attr, Color.GREEN);
                break;
            case R.styleable.CustomProgress_secondColor:
                secondColor = typedArray.getColor(attr, Color.RED);
                break;
            case R.styleable.CustomProgress_speed:
                speed = typedArray.getInt(attr, 20);
                break;
            case R.styleable.CustomProgress_circleWidth:
                circleWidth = typedArray.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
                        TypedValue.COMPLEX_UNIT_PX, 20, getResources().getDisplayMetrics()));
                break;
            default:
                break;
            }
        }
        typedArray.recycle();
        mPaint = new Paint();

        new Thread(new Runnable(){
            @Override
            public void run() {
                while(true){
                    curProgress += speed;
                    if(curProgress == 360){
                        curProgress = 0;
                        if(!isNext){
                            isNext = true;
                        }else {
                            isNext = false;
                        }
                    }
                    postInvalidate();
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
            }
        }).start();
    }

    @Override
    protected void onDraw(Canvas canvas) {

        int center =getWidth()/2;
        int radius = center - circleWidth/2;
        mPaint.setStrokeWidth(circleWidth);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setAntiAlias(true);
        RectF oval = new RectF(center-radius, center-radius, center+radius, center+radius);
        //canvas.drawArc(oval, 0, 360, false, mPaint);
        if(isNext){
            mPaint.setColor(firstColor);
            canvas.drawCircle(center, center, radius, mPaint);//画圆

            mPaint.setColor(secondColor);
            canvas.drawArc(oval, -90, curProgress, false, mPaint);

        }else{
            mPaint.setColor(secondColor);
            canvas.drawCircle(center, center, radius, mPaint);//画圆

            mPaint.setColor(firstColor);
            canvas.drawArc(oval, -90, curProgress, false, mPaint);
        }

    }

}
时间: 2024-11-07 11:34:38

android 自定义View(3)圆形View 加速条的相关文章

android自定义view-打造圆形ImageView(四)终结篇

前言: 说实话,这段时间忙着修改毕业论文,好长时间没有碰代码了,真是罪过呀.今天我们就来奉上我们打造圆形ImageView的终结篇,以后如果还有新的创意再说啦.本文是在前面三篇的基础上得来的,详细请戳android自定义view-打造圆形ImageView(一).android自定义view-打造圆形ImageView(二).android自定义view-打造圆形ImageView(三). 效果图: 正文: 其实看了上面的效果图,大家应该都一目了然了,就是很多应用经常见到的带有白色边缘的渐变头像

Android 自定义漂亮的圆形进度条

这几天对Android中实现画圆弧及圆弧效果中所实现的效果进行了修改,改为进度圆心进度条,效果如图所示 TasksCompletedView.java 代码如下 import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.RectF; impo

Android 自定义可拖拽View,界面渲染刷新后不会自动回到起始位置

以自定义ImageView为例: /** * 可拖拽ImageView * Created by admin on 2017/2/21. */ public class FloatingImageView extends ImageView{ public FloatingImageView(Context context) { super(context); } public FloatingImageView(Context context, AttributeSet attrs) { su

android 自定义水平和圆形progressbar 只定义一些style就可以

效果图: 修改progressbar 让他满足自己的需求一般来说只修改一下,progressbar的style就可以满足需求了: activity代码:仅仅显示一个布局而已 package com.example.testcustomprogressbar; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; public cl

Android自定义View——圆形进度条式按钮

介绍 今天上班的时候有个哥们问我怎么去实现一个按钮式的进度条,先来看看他需要实现的效果图. 和普通的圆形进度条类似,只是中间的地方有两个状态表示,未开始,暂停状态.而且他说圆形进度的功能已经实现了.那么我们只需要对中间的两个状态做处理就行了. 先来看看实现的效果图: 上面说了我们只需要处理中间状态的变化就可以了,对于进度的处理直接使用了弘洋文章中实现: http://blog.csdn.net/lmj623565791/article/details/43371299 下面开始具体实现. 具体实

android自定义View之(六)------高仿华为荣耀3C的圆形刻度比例图(ShowPercentView)

为什么写这篇文章: 显示当前的容量所占的比例,表现当前计划的进度,一般都会采用百分比的方式,而图形显示,以其一目了然的直观性和赏心悦目的美观形成为了我们的当然的首选. 在图形表示百分比的方法中,我们有用画圆的圆形进度条的方法<<android自定义View之(二)------简单进度条显示样例篇>>,也有用画弧形的进度条的方法<<android自定义View之(三)------视频音量调控样例>>,今天看到华为荣耀3C的一个界面: 个人觉得这个表示比例的圆形

我的Android进阶之旅------&gt;Android自定义View实现带数字的进度条(NumberProgressBar)

今天在Github上面看到一个来自于 daimajia所写的关于Android自定义View实现带数字的进度条(NumberProgressBar)的精彩案例,在这里分享给大家一起来学习学习!同时感谢daimajia的开源奉献! 第一步.效果展示 图1.蓝色的进度条 图2.红色的进度条 图3.多条颜色不同的进度条 图4.多条颜色不同的进度条 版权声明:本文为[欧阳鹏]原创文章,欢迎转载,转载请注明出处! [http://blog.csdn.net/ouyang_peng/article/deta

Android自定义带边框的圆形view

由于项目需要,需要做一个圆形的带边框并且里边还有文字的view →_→ ↓↓↓↓这样↓↓↓↓ 如果在布局文件中做的话是非常麻烦的,而且复用性也不高.所以想到用自定义一个view的来实现该功能,这样封装性和复用性就会相对提高,可方便在以后类似的项目中使用.可能也有同学有过这样的需求,所以在这分享出来供大家参考,不足之处还请多多指点. 看代码: 1package com.stock.manage.friend.view;import android.content.Context; 2 import

Android自定义View和Canvas绘图解析

自定义view的流程分为measure. layout.draw三个主要步骤,今天我们通过源码来分下下measure的过程 我们从顶级view开始,顶级view即DecorView, view的事件都是先经过这个DecorView, 接下来我们来看看这个DecorView的MeasureSpec的创建过程: ViewRoot 对应 ViewRootImpl类,  是连接WindowManager 和 DecorView的纽带,   进入ViewRootImpl中,查看measureHierarc