【Android自定义控件】圆圈交替,仿progress效果

还是我们自定View的那几个步骤:

1、自定义View的属性

2、在View的构造方法中获得我们自定义的属性

3、重写onMesure (不是必须)

4、重写onDraw

自定义View的属性

 <?xml version="1.0" encoding="utf-8"?>
<resources>
<attr name="firstColor" format="color" />
    <attr name="secondColor" format="color" />
    <attr name="circleWidth" format="dimension" />
    <attr name="speed" format="integer" />

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

自定义View,并且使用自定义的View

public class ProgressView extends View {

    /**
     * 第一圈的颜色
     */
    private int mFirstColor;
    /**
     * 第二圈的颜色
     */
    private int mSecondColor;
    /**
     * 圈的宽度
     */
    private int mCircleWidth;
    /**
     * 画笔
     */
    private Paint mPaint;
    /**
     * 当前进度
     */
    private int mProgress;

    /**
     * 速度
     */
    private int mSpeed;

    /**
     * 是否应该开始下一个
     */
    private boolean isNext = false;
    public ProgressView(Context context) {
        this(context, null);
    }

    public ProgressView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ProgressView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.progressStyle,defStyleAttr,0);

        int n = typedArray.getIndexCount();

        for (int i =0 ;i < n ; i ++){
            int attr =typedArray.getIndex(i);
            switch (attr){//这里的0,1,2,3对应attrs中declare-styleable name="progressStyle"数组元素的顺序,我是为了举例方便,实际开发中不要这样写
                case 0:
                    mFirstColor = typedArray.getColor(attr, Color.BLACK);
                    break;
                case 1:
                    mSecondColor = typedArray.getColor(attr, Color.RED);
                    break;
                case 2:
                    mCircleWidth = typedArray.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
 16,getResources().getDisplayMetrics()));
                    break;
                case 3:
                    mSpeed = typedArray.getInt(attr,20);
                    break;
            }
        }
        typedArray.recycle();
        mPaint = new Paint();
        startMyThread();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        int center = getWidth() / 2; // 获取圆心的x坐标
        int radius = (center - mCircleWidth)/2 ;// 半径

        mPaint.setAntiAlias(true);
        mPaint.setStrokeWidth(mCircleWidth);
        mPaint.setStyle(Paint.Style.STROKE);

        RectF rectf = new RectF(center-radius,center-radius,center+radius,center+radius);
//颜色的切换
        if(!isNext){
            canvas.save();
            mPaint.setColor(mFirstColor);// 设置圆环的颜色
            canvas.drawCircle(center,center,radius,mPaint);//划出圆圈
            mPaint.setColor(mSecondColor);
            canvas.drawArc(rectf,-90,mProgress,false,mPaint);//根据进度画圆弧
            canvas.restore();
        }else {
            canvas.save();
            mPaint.setColor(mSecondColor);// 设置圆环的颜色
            canvas.drawCircle(center,center,radius,mPaint);
            mPaint.setColor(mFirstColor);
            canvas.drawArc(rectf,-90,mProgress,false,mPaint);
            canvas.restore();
        }
    }

    private void startMyThread() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                while (true){
                    mProgress++;//进度
                    if(mProgress == 360){//当360度时候值变为初始状态
                        mProgress = 0;

                        if(!isNext){//设置是否切换颜色开关
                            isNext = true;
                        }else {
                            isNext = false;
                        }

                    }

                    postInvalidate();

                    try {
                        Thread.sleep(mSpeed);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                }
            }
        }).start();;
    }
<strong>
</strong>

   以上代码就是自定义View的全部代码,使用的话没什么多说的 直接在Xml中引用这个新建的ProgressView就可以了

重画ondraw   不多解释直接看代码

 @Override
    protected void onDraw(Canvas canvas) {
        int center = getWidth() / 2; // 获取圆心的x坐标
        int radius = (center - mCircleWidth)/2 ;// 半径

        mPaint.setAntiAlias(true);
        mPaint.setStrokeWidth(mCircleWidth);
        mPaint.setStyle(Paint.Style.STROKE);

        RectF rectf = new RectF(center-radius,center-radius,center+radius,center+radius);

        if(!isNext){
            canvas.save();
            mPaint.setColor(mFirstColor);// 设置圆环的颜色
            canvas.drawCircle(center,center,radius,mPaint);//划出圆圈
            mPaint.setColor(mSecondColor);
            canvas.drawArc(rectf,-90,mProgress,false,mPaint);//根据进度画圆弧
            canvas.restore();
        }else {
            canvas.save();
            mPaint.setColor(mSecondColor);// 设置圆环的颜色
            canvas.drawCircle(center,center,radius,mPaint);
            mPaint.setColor(mFirstColor);
            canvas.drawArc(rectf,-90,mProgress,false,mPaint);
            canvas.restore();
        }
    }

效果是不是和progress相似呢 ,自己试试看吧

【Android自定义控件】圆圈交替,仿progress效果

时间: 2024-10-05 23:34:29

【Android自定义控件】圆圈交替,仿progress效果的相关文章

android 自定义控件二之仿QQ长按删除

自定义Dialog 1.先上个效果图: 虽然效果丑了点,但主要学习修改已有的控件,例如修改Dialog控件 2.一些基本的只是进行了解 Dialog: theme是Dialog的样式,常用样式为: <style name="MyDialogStyle" parent="@android:Theme.Dialog"> <item name="android:windowFrame">@null</item> &l

android自定义控件实现刮刮乐效果

只是简单的实现了效果,界面没怎么做优化,不过那都是次要的啦!! 其中主要的彩票视图类和橡皮擦类都是通过代码的方式构建视图,布局文件就一个主activity_main 上代码!! 主activity: package com.guaguale; import android.app.Activity; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.V

android 自定义5.0版本 Progress效果-ProgressWheel(例如,淘宝加载)

在网上找到5.0Progress效果如下: 开源代码地址:https://github.com/pnikosis/materialish-progress attr.xml <declare-styleable name="ProgressWheel"> <attr name="matProg_progressIndeterminate" format="boolean" /> <attr name="ma

Android 自定义控件实现刮刮卡效果 真的就只是刮刮卡么

很久以前也过一个html5的刮刮卡效果~~上次看到有人写Android的刮刮卡效果~~于是乎产生了本篇博客~~此类例子也比较多了,大家可以百度看看~不过还是通过本例子,带大家发掘一下,里面隐含的知识~ 1.Xfermode以及PorterDuff 如果大家还记得,曾经在博客:完美实现图片圆角和圆形 简单介绍过圆角的实现原理也是基于这个. 首先我们看一下官方的例子,很好的展示了16种Mode的效果: 注:先绘制的Dst,再绘制的Src. 好了,看了这个图,我来问大家几个问题: 问题1.如果我想实现

android自定义控件系列教程-----仿新版优酷评论剧集卡片滑动控件

我们先来看看优酷的控件是怎么回事? 只响应最后也就是最顶部的卡片的点击事件,如果点击的不是最顶部的卡片那么就先把它放到最顶部,然后在移动到最前面来,反复如次. 知道了这几条那么我们就很好做了. 里面的技术细节可能就是child的放置到前面来的动画问题把. 先看看我们实现得效果: 然后仔细分析一下我们要实现怎么样的效果: 我也是放置了一个按钮和两个view在控件上面,只有当控件在最前面也就是最里面的时候才会响应事件. 然后我们就动手来实现这个控件. 我们继承一个ViewGroup并且命名为Exch

Android自定义控件之仿汽车之家下拉刷新

关于下拉刷新的实现原理我在上篇文章Android自定义控件之仿美团下拉刷新中已经详细介绍过了,这篇文章主要介绍表盘的动画实现原理 汽车之家的下拉刷新分为三个状态: 第一个状态为下拉刷新状态(pull to refresh),在这个状态下是一个表盘随着下拉的距离动态改变指针的角度 第二个状态为放开刷新状态(release to refresh),在这个状态下是指针角度变化的一个动画 第一个状态的实现: 这个效果我们使用自定义View来实现,我们从汽车之家apk中拿到下拉刷新所用到的两张图片: 我们

[转]Android自定义控件系列五:自定义绚丽水波纹效果

出处:http://www.2cto.com/kf/201411/353169.html 今天我们来利用Android自定义控件实现一个比较有趣的效果:滑动水波纹.先来看看最终效果图: 图一 效果还是很炫的:饭要一口口吃,路要一步步走,这里我们将整个过程分成几步来实现 一.实现单击出现水波纹单圈效果: 图二 照例来说,还是一个自定义控件,这里我们直接让这个控件撑满整个屏幕(对自定义控件不熟悉的可以参看我之前的一篇文章:Android自定义控件系列二:自定义开关按钮(一)).观察这个效果,发现应该

Android自定义控件系列五:自定义绚丽水波纹效果

尊重原创!转载请注明出处:http://blog.csdn.net/cyp331203/article/details/41114551 今天我们来利用Android自定义控件实现一个比较有趣的效果:滑动水波纹.先来看看最终效果图: 图一 效果还是很炫的:饭要一口口吃,路要一步步走,这里我们将整个过程分成几步来实现 一.实现单击出现水波纹单圈效果: 图二 照例来说,还是一个自定义控件,这里我们直接让这个控件撑满整个屏幕(对自定义控件不熟悉的可以参看我之前的一篇文章:Android自定义控件系列二

Android自定义控件实战——仿多看阅读平移翻页

转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38728119 之前自己做的一个APP需要用到翻页阅读,网上看过立体翻页效果,不过bug太多了还不兼容.看了一下多看阅读翻页是采用平移翻页的,于是就仿写了一个平移翻页的控件.效果如下: 在翻页时页面右边缘绘制了阴影,效果还不错.要实现这种平移翻页控件并不难,只需要定义一个布局管理页面就可以了.具体实现上有以下难点: 1.循环翻页,页面的重复利用. 2.在翻页时过滤掉多点触碰.