本文实例为大家分享了Android实现两圆点之间来回移动加载进度的具体代码,供大家参考,具体内容如下

一、前言

最近喜欢上自定义控件,喜欢实现一些简约有趣的控件,也好巩固下以前学得知识和不断的学习新知识,程序员嘛,活到老学到老。

这篇文章接着上一篇文章:Android_自定义控件之水平圆点加载进度条,类似的实现方式,都是些比较简单的view绘制。

二、实现

先看下实现的效果吧:

说下实现思路:圆点x轴会有个位移变化量,当位移达到圆点直径+圆点间距之和就回改变方向(改变方向就是通过变化量值不断增加和不断减少来实现),可能写的有点模糊,接下来看代码:

package com.kincai.testcustomview_dotalternatelyprogress;

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Canvas;

import android.graphics.Paint;

import android.support.annotation.Nullable;

import android.support.v4.content.ContextCompat;

import android.util.AttributeSet;

import android.util.Log;

import android.view.View;

/**

* Copyright (C) 2015 The KINCAI Open Source Project

* .

* Create By KINCAI

* .

* Time 2017-06-16 21:44

* .

* Desc 两个源点来回移动

*/

public class DotAlternatelyView extends View {

private final String TAG = this.getClass().getSimpleName();

private Paint mPaint = new Paint();

/**

* 可视为左边圆点颜色值

*/

private int mLeftColor;

/**

* 可视为右边圆点颜色值

*/

private int mRightColor;

/**

* 圆点半径

*/

private int mDotRadius;

/**

* 圆点间距

*/

private int mDotSpacing;

/**

* 圆点位移量

*/

private float mMoveDistance;

/**

* 圆点移动率

*/

private float mMoveRate;

/**

* 以刚开始左边圆点为准 向右移

*/

private final int DOT_STATUS_RIGHT = 0X101;

/**

* 以刚开始左边圆点为准 圆点移动方向-向左移

*/

private final int DOT_STATUS_LEFT = 0X102;

/**

* 以刚开始左边圆点为准,圆点移动方向

*/

private int mDotChangeStatus = DOT_STATUS_RIGHT;

/**

* 圆点透明度变化最大(也就是透明度在255-mAlphaChangeTotal到255之间)

*/

private int mAlphaChangeTotal = 130;

/**

* 透明度变化率

*/

private float mAlphaChangeRate;

/**

* 透明度改变量

*/

private float mAlphaChange;

public DotAlternatelyView(Context context) {

this(context, null);

}

public DotAlternatelyView(Context context, @Nullable AttributeSet attrs) {

this(context, attrs, 0);

}

public DotAlternatelyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.DotAlternatelyView, defStyleAttr, 0);

initAttributes(typedArray);

typedArray.recycle();

init();

}

private void initAttributes(TypedArray Attributes) {

mLeftColor = Attributes.getColor(R.styleable.DotAlternatelyView_dot_dark_color, ContextCompat.getColor(getContext(), R.color.colorPrimary));

mRightColor = Attributes.getColor(R.styleable.DotAlternatelyView_dot_light_color, ContextCompat.getColor(getContext(), R.color.colorAccent));

mDotRadius = Attributes.getDimensionPixelSize(R.styleable.DotAlternatelyView_dot_radius, DensityUtils.dp2px(getContext(), 3));

mDotSpacing = Attributes.getDimensionPixelSize(R.styleable.DotAlternatelyView_dot_spacing, DensityUtils.dp2px(getContext(), 6));

mMoveRate = Attributes.getFloat(R.styleable.DotAlternatelyView_dot_move_rate, 1.2f);

}

/**

* 初始化

*/

private void init() {

//移动总距离/移动率 = alpha总变化/x

//x = 移动率 * alpha总变化 / 移动总距离

mAlphaChangeRate = mMoveRate * mAlphaChangeTotal / (mDotRadius * 2 + mDotSpacing);

mPaint.setColor(mLeftColor);

mPaint.setAntiAlias(true);

mPaint.setStyle(Paint.Style.FILL);

Log.e(TAG, " aaaa " + mAlphaChangeRate);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

//测量宽高

int widthMode = MeasureSpec.getMode(widthMeasureSpec);

int widthSize = MeasureSpec.getSize(widthMeasureSpec);

int heightMode = MeasureSpec.getMode(heightMeasureSpec);

int heightSize = MeasureSpec.getSize(heightMeasureSpec);

int width;

int height;

if (widthMode == MeasureSpec.EXACTLY) {

width = widthSize;

Log.e(TAG, "onMeasure MeasureSpec.EXACTLY widthSize=" + widthSize);

} else {

//指定最小宽度所有圆点加上间距的宽度, 以最小半径加上间距算总和再加上最左边和最右边变大后的距离

width = (mDotRadius * 2) * 2 + mDotSpacing;

Log.e(TAG, "onMeasure no MeasureSpec.EXACTLY widthSize=" + widthSize + " width=" + width);

if (widthMode == MeasureSpec.AT_MOST) {

width = Math.min(width, widthSize);

Log.e(TAG, "onMeasure MeasureSpec.AT_MOST width=" + width);

}

}

if (heightMode == MeasureSpec.EXACTLY) {

height = heightSize;

Log.e(TAG, "onMeasure MeasureSpec.EXACTLY heightSize=" + heightSize);

} else {

height = mDotRadius * 2;

Log.e(TAG, "onMeasure no MeasureSpec.EXACTLY heightSize=" + heightSize + " height=" + height);

if (heightMode == MeasureSpec.AT_MOST) {

height = Math.min(height, heightSize);

Log.e(TAG, "onMeasure MeasureSpec.AT_MOST height=" + height);

}

}

setMeasuredDimension(width, height);

}

@Override

protected void onDraw(Canvas canvas) {

//左边圆点起点x轴

int startPointX = getWidth() / 2 - (2 * mDotRadius * 2 + mDotSpacing) / 2 + mDotRadius;

//左边圆点起点y轴

int startPointY = getHeight() / 2;

//向右移 位移要增加对应透明度变化量也需要增加 反之都需要减小

if (mDotChangeStatus == DOT_STATUS_RIGHT) {

mMoveDistance += mMoveRate;

mAlphaChange += mAlphaChangeRate;

} else {

mAlphaChange -= mAlphaChangeRate;

mMoveDistance -= mMoveRate;

}

Log.e(TAG, "mAlphaChange " + mAlphaChange);

//当移动到最右 那么需要改变方向 反过来

if (mMoveDistance >= mDotRadius * 2 + mDotSpacing && mDotChangeStatus == DOT_STATUS_RIGHT) {

mDotChangeStatus = DOT_STATUS_LEFT;

mMoveDistance = mDotRadius * 2 + mDotSpacing;

mAlphaChange = mAlphaChangeTotal;

} else if (mMoveDistance <= 0 && mDotChangeStatus == DOT_STATUS_LEFT) { //当移动到最座 那么需要改变方向 反过来

mDotChangeStatus = DOT_STATUS_RIGHT;

mMoveDistance = 0f;

mAlphaChange = 0f;

}

//因为两个圆点可能会给定不同的颜色来显示 所以提供两种颜色设置mLeftColor和mRightColor

mPaint.setColor(mLeftColor);

mPaint.setAlpha((int) (255 - mAlphaChange));

canvas.drawCircle(startPointX + mMoveDistance, startPointY, mDotRadius, mPaint);

mPaint.setColor(mRightColor);

mPaint.setAlpha((int) (255 - mAlphaChange));

canvas.drawCircle(startPointX + mDotRadius * 2 - mMoveDistance + mDotSpacing, startPointY, mDotRadius, mPaint);

invalidate();

}

}

要是不容易理解的话,下载源码运行再对着源码看会容易理解

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

Android更新圆点代码,Android实现两圆点之间来回移动加载进度相关推荐

  1. Android通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    在加载大量数据的时候,经常会用到异步加载,所谓异步加载,就是把耗时的工作放到子线程里执行,当数据加载完毕的时候再到主线程进行UI刷新.在数据量非常大的情况下,我们通常会使用两种技术来进行异步加载,一是 ...

  2. Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比

    Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比 标签: AndroidAsyncTaskThreadPool异步加载view 2 ...

  3. android 加载进度,Android实现图片加载进度提示

    本文实例为大家分享了Android实现图片加载进度提示的具体代码,供大家参考,具体内容如下 先上图: 实现原理: 第一个控件的实现原理是重写ImageView的onDraw()方法,利用Canvas的 ...

  4. android webview 加载进度和自定义404错误页面

    原帖地址:http://www.cnblogs.com/winxiang/archive/2012/10/25/2738320.html 自定义404页面.android的webview 控件可以加载 ...

  5. android 自定义view 加载图片,Android自定义View基础开发之图片加载进度条

    学会了Paint,Canvas的基本用法之后,我们就可以动手开始实践了,先写个简单的图片加载进度条看看. 按照惯例,先看效果图,再决定要不要往下看: 既然看到这里了,应该是想了解这个图片加载进度条了, ...

  6. Android中Fragment知识点终极整理 避免多个Fragment加载重叠踩坑

    Fragment Fragment定义 Fragment为什么被称为第五大组件 Fragment加载到Activity的两种方式 FragmentPagerAdapter和FragmentStateP ...

  7. android 加载条封装,Android基于JsBridge封装的高效带加载进度的WebView

    图片发自简书App 概述 从去年4月项目就一直用起了JsBridge,前面也针对jsBridge使用姿势介绍过一篇入门篇,<Android JsBridge实战 打造专属你的Hybrid APP ...

  8. android webview设置加载进度条

    1.自定义属性文件--attrs.xml <?xml version="1.0" encoding="utf-8"?> <resources& ...

  9. Android缓冲进度条或加载进度条

    缓冲进度条或加载进度条,在加载页面或者视频加载过程中,为了做到更好的UI及App功能体验交互,这些缓冲加载的等待效果是必不可少的: 下面来看一下旋转的动画效果: 那么,他们的具体源码在这里:loadi ...

最新文章

  1. 后序遍历的非递归算法python_刷题系列 - Python用非递归实现二叉树后续遍历
  2. why do you want to university of cambridge?
  3. 【转】3D图形引擎(DX9): FX
  4. BERT源码分析(PART III)
  5. c cuda 指定gpu_《CUDA C编程权威指南》——1.3 用GPU输出Hello World-阿里云开发者社区...
  6. 360 mysql账户_MYSQL用户管理
  7. thymealf如何实现传单个变量给html_梦回2013,看尤大vue的第一行代码,如何用30行代码实现vue(超简洁,适合初学者)...
  8. java传递实例_Java方法的参数传递机制实例详解
  9. python绘制散点图的步骤_python如何绘制散点图?
  10. 递归不行就换动态规划(洛谷P1028题题解,Java语言描述)
  11. mysql查看binlog_MySQL的binlog数据如何查看
  12. iOS-Runtime-Headers
  13. python-第三课-字符串详解
  14. 不使用中国手机号码注册网易云音乐
  15. Mac 解压rar格式文件(附解压工具包)
  16. 《java核心技术36讲》学习笔记-------杨晓峰(极客时间)
  17. PowerPivot——DAX(函数)
  18. 【NLP】11大Java开源中文分词器的使用方法和分词效果对比
  19. C++程序设计课程中的团队建设
  20. visio2002无法安装(您必须首先安装Enterprise Architect Edition of visual Studio.Net2003)的解决方案

热门文章

  1. ctfshow学习记录-web入门(命令执行69-77118)
  2. 派生方法的实战演练, 封装,多态,反射
  3. 深度学习入门(六十四)循环神经网络——编码器-解码器架构
  4. Cadence封装库操作学习(一)
  5. vivo x20都出来了,但是这几款手机还是别买的了,即使他便宜!
  6. 《三》CSS 中的 display 属性
  7. 真-全局代理原理细谈
  8. JVM-Shenandoah GC-29
  9. jvm学习 Shenandoah垃圾收集器
  10. GH3536(GH536) 热处理制度 板材和管材