Android 自定义View (三) 圆环交替 等待效果

转载自:http://blog.csdn.net/lmj623565791/article/details/24500107

一个朋友今天有这么个需求(下图),我觉得那自定义View来做还是很适合的,就做了下,顺便和大家分享下,对于自定义View多练没坏处么。如果你看了前两篇,那么这篇一定so easy 。


效果就这样,分析了一下,大概有这几个属性,两个颜色,一个速度,一个圆环的宽度。

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

1、自定义View的属性

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

[ 3、重写onMesure ]

4、重写onDraw

-------------------------------------------------------------------------------------------------------------------

1、自定义属性:

<?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="CustomViewCircle">
        <attr name="firstColor" />
        <attr name="secondColor" />
        <attr name="circleWidth" />
        <attr name="speed" />
    </declare-styleable>
</resources>
2、 在View的构造方法中获得我们自定义的属性

3、直接重写onDraw,这不需要重写onMeasure

package zdd.customview.hongyangview.circle;

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

import zdd.customview.R;

/**
 * Created by ZDD on 2016/8/2.
 */
public class CustomViewCircle extends View {
    // 第一种圆环颜色
    private int firstColor;
    // 第二种圆环颜色
    private int secondColor;
    // 圆环宽度
    private int circleWidth;
    // 速度
    private int speed;
    // 画笔
    private Paint paint;

    // 当前进度
    private int progress;
    // 是否绘制下一个圆环
    private boolean isNext = false;

    public CustomViewCircle(Context context) {
        this(context, null);
    }

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

    public CustomViewCircle(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // 获取到自定义的属性
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomViewCircle);
        // 获取自定义属性的数量
        int typeCount = typedArray.getIndexCount();
        for (int i = 0; i < typeCount; i++) {
            int position = typedArray.getIndex(i);
            switch (position) {
                case R.styleable.CustomViewCircle_firstColor:
                    firstColor = typedArray.getColor(position, 0);
                    break;
                case R.styleable.CustomViewCircle_secondColor:
                    secondColor = typedArray.getColor(position, 0);
                    break;
                case R.styleable.CustomViewCircle_circleWidth:
                    circleWidth = (int) typedArray.getDimension(position, TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 20, getResources().getDisplayMetrics()));
                    break;
                case R.styleable.CustomViewCircle_speed:
                    speed = typedArray.getIndex(position);
                    break;
            }
        }
        typedArray.recycle();
        // 初始化画笔
        paint = new Paint();
        new Thread() {
            @Override
            public void run() {
                while (true) {
                    progress++;
                    if (progress == 360) {
                        progress = 0;
                        if (!isNext)
                            isNext = true;
                        else
                            isNext = false;
                    }
                    // 重绘view
                    postInvalidate();
                    try {
                        Thread.sleep(speed);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // 获取圆心的x坐标
        int circle = getWidth() / 2;
        // 获取半径
        int radius = circle - circleWidth / 2;
        // 设置圆环的宽度
        paint.setStrokeWidth(circleWidth);
        // 消除锯齿
        paint.setAntiAlias(true);
        // 设置空心样式
        paint.setStyle(Paint.Style.STROKE);
        // 定义圆弧的大小和界限 参数为上下左右的坐标值
        RectF rectF = new RectF(circle - radius, circle - radius, circle + radius, circle + radius);
        if (!isNext) {
            paint.setColor(firstColor);
            // 画出圆环 参数为圆环的x坐标y坐标半径和画笔
            canvas.drawCircle(circle, circle, radius, paint);
            // 设置圆环的颜色。根据进度绘制圆环
            paint.setColor(secondColor);
            // oval :指定圆弧的外轮廓矩形区域。
            // startAngle: 圆弧起始角度,单位为度。
            // sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度。
            // useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。
            // paint: 绘制圆弧的画板属性,如颜色,是否填充等。
            canvas.drawArc(rectF, -90, progress, false, paint);
        } else {
            paint.setColor(secondColor);
            canvas.drawCircle(circle, circle, radius, paint);
            paint.setColor(firstColor);
            canvas.drawArc(rectF, -90, progress, false, paint);
        }
    }
}

4.书写activity

package zdd.customview.hongyangview.circle;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

import zdd.customview.R;

/**
 * Created by ZDD on 2016/8/2.
 */
public class CustomActivityThred extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.three_activity_custom_circle);
    }
}
5.定义xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <zdd.customview.hongyangview.circle.CustomViewCircle
        android:layout_width="100dp"
        android:layout_height="100dp"
        app:circleWidth="8px"
        app:firstColor="#ff00ff"
        app:secondColor="#ffff00"
        app:speed="8" />

    <zdd.customview.hongyangview.circle.CustomViewCircle
        android:layout_width="200dp"
        android:layout_height="200dp"
        app:circleWidth="18px"
        app:firstColor="#ff00ff"
        app:secondColor="#ffff00"
        app:speed="18" />
</LinearLayout>




大功完成了,当然了,唯一比较纠结的地方就是两个颜色何时切换,如何切换,我采用上面的办法,你也可以自己想想怎么实现。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值