android 自定义控件之简单的loading框

  好吧,久不动android,感觉自己已经快是条咸鱼了,趁着这周的开发任务已完成,下周的开发计划未下来之际,来温习一下android的自定义控件,于是就有了下面这个丑陋的玩意

  

  实现起来也是非常简单,下面直接上代码;

  

public class RingLoading extends View {    private final Context mContext;    private Paint mPaint;    private int outRadius;    private int innerRadius;    private int ringWidth = 20;    private int[] center = new int[2];    private float startIndex = -90;    private float endIndex = 0;    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            invalidate();        }    };

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

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

public RingLoading(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        mContext = context;        init();    }

private void init() {        mPaint = new Paint();        mPaint.setColor(Color.WHITE);        mPaint.setStyle(Paint.Style.STROKE);        mPaint.setAntiAlias(true);    }

@Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        int width = MeasureSpec.getSize(widthMeasureSpec);        int height = MeasureSpec.getSize(heightMeasureSpec);        center[0] = width / 2;        center[1] = height / 2;        outRadius = (width > height ? height / 2 : width / 2) - ringWidth;        innerRadius = outRadius - ringWidth;        Logger.i("size", outRadius, innerRadius);        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }

@Override    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {        super.onLayout(changed, left, top, right, bottom);    }

@Override    protected void onDraw(Canvas canvas) {        mPaint.setStrokeWidth(ringWidth);        mPaint.setARGB(0, 0, 0, 0);        canvas.drawCircle(center[0], center[1], innerRadius, mPaint);        mPaint.setARGB(255, 0, 0, 255);        canvas.drawCircle(center[0], center[1], outRadius, mPaint);        mPaint.setARGB(255, 255, 255, 255);        RectF rect = new RectF(ringWidth, ringWidth, ringWidth + 2 * outRadius, ringWidth + 2 *                outRadius);        canvas.drawArc(rect, startIndex, endIndex, false, mPaint);        super.onDraw(canvas);    }

public void startLoading() {        Timer timer = new Timer();        TimerTask timerTask = new TimerTask() {            @Override            public void run() {                startIndex++;                if (startIndex < 0) {                    endIndex ++;                } else if (startIndex > 180) {                    endIndex--;                    if (startIndex == 270) {                        startIndex = -90;                        endIndex = 0;                    }                } else {                    endIndex = 90;                }                mHandler.obtainMessage(1).sendToTarget();            }        };        timer.schedule(timerTask, 100, 5);    }}

然后做一下简单的分析吧,免得以后回过头来看又要理一会。  从实现效果来看,整个控件就是一个圆环,环上一个长短变化的白条,不停的转啊转的。如果白条长短不变的话,那就简单了,直接放个图,写个旋转动画就OK了,关键是变化的啊,那就不得不弄个画布,自己来画了,由于圆环和白条都是画出来的,所以只要继承View就好了;  init()方法给画笔初始化一些东西,这个没什么好说的,主要的实现代码,都集中在onMeasure,onDraw和startLoading这三个方法里,其中onMeasure获得外圆和内园的半径以及圆心的坐标,onDraw方法根据半径和坐标画出圆环和旋转的圆弧,startLoading方法不断改变圆环的起始弧度和圆弧的弧长对应的圆心角,然后通知控件重绘(终止方法我这里没写,调用timer的cancel方法就好了);  知道了各个方法的作用,下面就具体进入这些方法分析一些细节:  首先是onMeasure(int widthMeasureSpec, int heightMeasureSpec),这个方法是系统回调的,它会在适当的时机,将控件的宽高信息返回给我们,也就是这两个参数,这两个参数都是32位的整形,其中,前两位表示模式,可以通过MeasureSpec.getMode(int ...) 来获取,模式分为三种,              MeasureSpec.UNSPECIFIED,默认的,宽高未被父控件做任何限制;              MeasureSpec.AT_MOST,在布局文件申明为android:layout_width = "wrap_content"时为此模式;              MeasureSpec.EXACTLY,布局文件中指定具体的dp,或者为MATCH_PARENT值时是此模式;MeasureSpec.getSize(int ...) 获得控件的尺寸;

  然后是onDraw方法,  canvas.drawCircle(float centerX,floatCenterY,int radius,Paint) 这个是画圆的方法,             canvas.drawArc(RectF,startAngle,lenghtAngle,boolean userCenter,Paint),这个是画弧线的方法,了解了这两个方法,onDraw的理解也不成为题。

最后就是startLoading了,这个方法就只是涉及逻辑的变化了,这个逻辑并不复杂,就不所说了,此次记录就到这里了,bye~~~
时间: 2024-10-14 21:58:48

android 自定义控件之简单的loading框的相关文章

Android:Toast简单消息提示框

Toast是简单的消息提示框,一定时间后自动消失,没有焦点. 1.简单文本提示的方法: //参数1:当前的上下文环境.this或getApplicationContext() //参数2:提示内容 //参数3:显示的时间长短 Toast toast = Toast.makeText(this, "默认的toast", Toast.LENGTH_LONG); toast.show(); 2.自定义位置的方法: Toast toast = Toast.makeText(this, &quo

android 自定义控件之水波纹loading的实现

恩恩,需求还是没有下来,整了一天多,再次整出一个loading框,看来我对loading框是情有独钟,好了,不多bb,先上图: 恩,就是这么个东东,较之前两个,有了点技术含量,但是其实也不是很难,之所以做了一天多,原因是又特么踩了一个坑,坑了我一个下午的时间,伤不起,至于是什么坑,下面再说: 好了,完成这个之前必要的知识储备,二阶贝塞尔曲线,也去网上看了一些文章,还有说要三阶贝塞尔曲线知识的,其实我觉得没必要,二阶就够了,下面附上一个链接,看完就知道贝塞尔曲线到底是个 什么 东东了:http:/

Android一个简单的警告框,带标题、图标、按钮的代码

工作之余,将内容过程比较常用的内容做个珍藏,下面内容是关于Android一个简单的警告框,带标题.图标.按钮的内容,应该是对大伙有些用. AlertDialog alertDialog = new AlertDialog.Builder(this).create();alertDialog.setTitle("Title");alertDialog.setMessage("Message");alertDialog.setButton("OK",

Android笔记——Android自定义控件

目录: 1.自定义控件概述 01_什么是自定义控件 Android系统中,继承Android系统自带的View或者ViewGroup控件或者系统自带的控件,并在这基础上增加或者重新组合成我们想要的效果. 02_为什么用自定义控件 系统控件无法满足需求时,需要自定义控件. 系统的控件在不同手机长得不一样,我们希望在不同手机实现相同的效果: 有些手机上的控件长得不好看,希望好看一些. 系统控件的功能有限,需要在基础上增加功能. 03_怎么用自定义控件-三种方式 1.使用系统控件,重新组合,实现自定义

Android自定义控件(状态提示图表) (转)

源:Android自定义控件(状态提示图表) 源:Android应用开发 [工匠若水 http://blog.csdn.net/yanbober 转载烦请注明出处,尊重分享成果] 1  背景 前面分析那么多系统源码了,也该暂停下来休息一下,趁昨晚闲着看见一个有意思的需求就操练一下分析源码后的实例演练—-自定义控件. 这个实例很适合新手入门自定义控件.先看下效果图: 横屏模式如下: 竖屏模式如下: 看见没有,这个控件完全自定义的,连文字等都是自定义的,没有任何图片等资源,就仅仅是一个小的java文

【android自定义控件】ProgressBar自定义

ProgressBar分为垂直和水平 经常在数据加载过程中,为了让用户感觉友好,弹出一个提示圆形的加载框 水平的经常在下载应用的时候用到,还伴随着下载进度. ProgressBar的样式有四种: android:progressBarStyle:默认进度条样式,不确定模式 android:progressBarStyleHorizontal:水平进度条样式 android:progressBarStyleLarge :大号进度条样式,也是不确定进度模式 android:progressBarSt

Android自定义控件系列八:详解onMeasure()(二)--利用onMeasure测量来实现图片拉伸永不变形,解决屏幕适配问题

上一篇文章详细讲解了一下onMeasure/measure方法在Android自定义控件时的原理和作用,参看博文:Android自定义控件系列七:详解onMeasure()方法中如何测量一个控件尺寸(一),今天就来真正实践一下,让这两个方法大显神威来帮我们搞定图片的屏幕适配问题. 请尊重原创劳动成果,转载请注明出处:http://blog.csdn.net/cyp331203/article/details/45038329,非允许请勿用于商业或盈利用途,违者必究. 使用ImageView会遇到

Android学习(十)—— Android自定义控件

Android自定义控件 安卓在使用中大多数使用已有的一些控件,用法比较简单,还有一部分是比较复杂的.用户自己想的控件,这些就需要进行自定义控件,今天就来简单说一下自定义控件. 1.绘制过程 创建一个类,继承View类 onMeasure()方法,测量计算视图的大小 onLayout()方法,设置视图在屏幕中显示的位置 onDraw()方法,绘制视图 以上就是自定义控件的绘制过程. 2.主要内容解释 measure操作 用于计算视图的大小,即视图的宽度和长度.在view中定义为final类型,要

Android自定义控件之自定义组合控件(三)

前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发成本,以及维护成本. 使用自定义组合控件的好处? 我们在项目开发中经常会遇见很多相似或者相同的布局,比如APP的标题栏,我们从三种方式实现标题栏来对比自定义组件带来的好处,毕竟好的东西还是以提高开发效率,降低开发成本为导向的. 1.)第一种方式:直接在每个xml布局中写相同的标题栏布局代码 <?xm