Android 自定義view實(shí)現(xiàn)進(jìn)度條加載效果實(shí)例代碼
這個(gè)其實(shí)很簡(jiǎn)單,思路是這樣的,就是拿view的寬度,除以點(diǎn)的點(diǎn)的寬度+二個(gè)點(diǎn) 之間的間距,就可以算出大概能畫(huà)出幾個(gè)點(diǎn)出來(lái),然后就通過(guò)canvas畫(huà)出點(diǎn),再然后就是每隔多少時(shí)間把上面移動(dòng)的點(diǎn)不斷的去改變它的坐標(biāo)就可以,
效果如下:

分析圖:

代碼如下:
package com.example.dotloadview;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.View;
/**
* Created by zhouguizhi on 6/18/15.
*/
public class DotLoadProgressView extends View {
private boolean isStart = false;
private int dotIndex =0;//點(diǎn)下面的角標(biāo)
private int dotNumber = 0;
private Paint mPaint;
private int paddingTop = 50;
private int paddingBottom = 50;
private int paddingLeft = 30;
private int paddingRight = 30;
private Handler mHandler = new Handler();
private long DELAY_TIME = 300;
private Bitmap bitmap;
private int itemDotSpace = 10;//二個(gè)點(diǎn)之間的距離
private Bitmap moveBitmap ;
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
if (dotNumber != 0){
dotIndex = (dotIndex + 1) % dotNumber;
}
invalidate();
mHandler.postDelayed(mRunnable, DELAY_TIME);
}
};
public DotLoadProgressView(Context context, AttributeSet attrs) {
super(context, attrs);
moveBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.active_dot);
init();
}
private void init() {
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setDither(true);
mPaint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
for(int i=0;i<dotNumber;i++){
canvas.drawBitmap(bitmap,paddingLeft+i*itemDotSpace+bitmap.getWidth()*i,paddingTop,mPaint);
}
if(isStart){
canvas.drawBitmap(moveBitmap,paddingLeft+dotIndex*itemDotSpace+moveBitmap.getWidth()*dotIndex,paddingTop,mPaint);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.inactive_dot);
setMeasuredDimension(parentWidth,bitmap.getHeight()+paddingTop+paddingBottom);
int widthWithoutPadding = parentWidth - paddingLeft - paddingRight;
dotNumber = calculateDotsNumber(widthWithoutPadding);
}
private int calculateDotsNumber(int width) {
int number = (width / (itemDotSpace + bitmap.getWidth()));
return number;
}
public void startProgress() {
isStart = true;
dotIndex = -1;
mHandler.removeCallbacks(mRunnable);
mHandler.post(mRunnable);
}
public void stopProgress() {
isStart = false;
mHandler.removeCallbacks(mRunnable);
invalidate();
}
@Override
protected void onAttachedToWindow() {
super.onAttachedToWindow();
startProgress();
}
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
stopProgress();
}
}
布局代碼:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<com.example.dotloadview.DotLoadProgressView
android:id="@+id/progress1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</RelativeLayout>
二個(gè)點(diǎn)其實(shí)是圖片,在網(wǎng)上別人項(xiàng)目中拿出來(lái)用的,如果感覺(jué)那個(gè)點(diǎn)圖片大了的話,有二個(gè)辦法,第一叫你們美工切小點(diǎn),第二就是通過(guò)drawable.setBound()去限制他大小了,我在這其實(shí)是偷懶,沒(méi)有那么做,當(dāng)然這點(diǎn)你也可以通過(guò)shade去做,而不用圖片的話
最終的效果圖還是這樣的:

總結(jié)
以上所述是小編給大家介紹的Android 自定義view實(shí)現(xiàn)進(jìn)度條加載效果實(shí)例代碼,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Android自定義帶加載動(dòng)畫(huà)效果的環(huán)狀進(jìn)度條
- Android開(kāi)發(fā)之ProgressBar字體隨著進(jìn)度條的加載而滾動(dòng)
- Android自定義View仿華為圓形加載進(jìn)度條
- Android中WebView加載網(wǎng)頁(yè)設(shè)置進(jìn)度條
- Android Material加載進(jìn)度條制作代碼
- Android自定義View基礎(chǔ)開(kāi)發(fā)之圖片加載進(jìn)度條
- Android Webview添加網(wǎng)頁(yè)加載進(jìn)度條實(shí)例詳解
- Android中實(shí)現(xiàn)Webview頂部帶進(jìn)度條的方法
- Android WebView線性進(jìn)度條實(shí)例詳解
- Android自定義帶進(jìn)度條WebView仿微信加載過(guò)程
相關(guān)文章
Android ScrollView實(shí)現(xiàn)向上滑動(dòng)控件頂部懸浮效果
這篇文章主要為大家詳細(xì)介紹了Android ScrollView實(shí)現(xiàn)向上滑動(dòng)控件頂部懸浮效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-05-05
快速解決Android適配底部返回鍵等虛擬鍵盤(pán)的問(wèn)題
今天小編就為大家分享一篇快速解決Android適配底部返回鍵等虛擬鍵盤(pán)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Android網(wǎng)絡(luò)通信的實(shí)現(xiàn)方式
這篇文章主要為大家詳細(xì)介紹了Android網(wǎng)絡(luò)通信的實(shí)現(xiàn)方式,四種實(shí)現(xiàn)網(wǎng)絡(luò)通信的方式供大家學(xué)習(xí),感興趣的小伙伴們可以參考一下2016-06-06
Jetpack Compose之選擇器使用實(shí)例講解
這篇文章主要介紹了Jetpack Compose之選擇器使用,選擇器主要是指Checkbox復(fù)選框,單選開(kāi)關(guān)Switch,滑桿組件Slider等用于提供給用戶選擇一些值和程序交互的組件,比如像復(fù)選框Checkbox,可以讓用戶選擇一個(gè)或者多個(gè)選項(xiàng)2023-04-04
Android?Studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了Android?Studio實(shí)現(xiàn)簡(jiǎn)易計(jì)算器設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
淺析Android系統(tǒng)的架構(gòu)以及程序項(xiàng)目的目錄結(jié)構(gòu)
這篇文章主要介紹了Android系統(tǒng)的架構(gòu)以及程序項(xiàng)目的目錄結(jié)構(gòu),是安卓開(kāi)發(fā)入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2016-04-04

