欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android自定義進(jìn)度條的圓角橫向進(jìn)度條實(shí)例詳解

 更新時(shí)間:2016年09月19日 11:18:09   作者:It一zhai男  
本文通過(guò)實(shí)例代碼給大家詳細(xì)介紹了Android自定義進(jìn)度條的圓角橫向進(jìn)度條的相關(guān)資料。非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧

1.本文將向你介紹自定義進(jìn)度條的寫法,比較簡(jiǎn)單,但還是有些知識(shí)點(diǎn)是需要注意的:

invalidate()方法
RectF方法的應(yīng)用
onMeasure方法的應(yīng)用

2.原理

畫3層圓角矩形,底層為黑色,第二層為灰色,最上一層為進(jìn)度條顏色,示例圖如下:

這里寫圖片描述

3.效果圖

這里寫圖片描述 

實(shí)現(xiàn)圓角進(jìn)度條還有很多其他方法,比如在Progress控件里填充圓角圖片,通過(guò)拉伸圖片來(lái)達(dá)到預(yù)想的效果,雖然聽起來(lái)很簡(jiǎn)單,但實(shí)現(xiàn)起來(lái)還是有些麻煩的。

4.解說(shuō)方法

(1)invalidate()方法

invalidate()是用來(lái)刷新View的,必須是在UI線程中進(jìn)行工作。比如在修改某個(gè)view的顯示時(shí), 調(diào)用invalidate()才能看到重新繪制的界面。invalidate()的調(diào)用是把之前的舊的view從主UI線程隊(duì)列中pop掉。一般在自定義控件中會(huì)用到這個(gè)方法。

(2)RectF方法的應(yīng)用

RectF是用來(lái)繪畫矩形的方法。

RectF(left,top,right,bottom),四個(gè)參數(shù)的含義分別是父控件距離矩形左上右下邊距的距離,以下用圖來(lái)說(shuō)明:

drawRoundRect方法是用來(lái)繪制圓角矩形的,它的參數(shù)如下:
參數(shù)說(shuō)明

rect:RectF對(duì)象。
rx:x方向上的圓角半徑。
ry:y方向上的圓角半徑。
paint:繪制時(shí)所使用的畫筆。

(3)onMeasure方法

指定自定義控件在屏幕上的大小,onMeasure方法的兩個(gè)參數(shù)是由上一層控件 傳入的大小,而且是模式和尺寸混合在一起的數(shù)值,需要MeasureSpec.getMode(widthMeasureSpec) 得到模式,MeasureSpec.getSize(widthMeasureSpec)得到尺寸。

onMeasure的幾種模式分別為EXACTLY,AT_MOST,UNSPECIFIED。

[1]MeasureSpec.EXACTLY

MeasureSpec.EXACTLY是精確尺寸,當(dāng)我們將控件的layout_width或layout_height指定為具體數(shù)值時(shí)如andorid:layout_width=”50dip”,或者為FILL_PARENT是,都是控件大小已經(jīng)確定的情況,都是精確尺寸。

[2]MeasureSpec.AT_MOST

MeasureSpec.AT_MOST是最大尺寸,當(dāng)控件的layout_width或layout_height指定為WRAP_CONTENT時(shí),控件大小一般隨著控件的子空間或內(nèi)容進(jìn)行變化,此時(shí)控件尺寸只要不超過(guò)父控件允許的最大尺寸即可。因此,此時(shí)的mode是AT_MOST,size給出了父控件允許的最大尺寸。

[3]MeasureSpec.UNSPECIFIED

MeasureSpec.UNSPECIFIED是未指定尺寸,這種情況不多,一般都是父控件是AdapterView,通過(guò)measure方法傳入的模式。

5.activity_main.xml文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.progresstest.MainActivity"
tools:ignore="MergeRootFrame" >
<com.example.progresstest.ProgressViewTest 
android:id="@+id/progressbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>

6.ProgressViewTest.java文件

package com.example.progresstest;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
public class ProgressViewTest extends View {
/**進(jìn)度條最大值*/
private float maxCount;
/**進(jìn)度條當(dāng)前值*/
private float currentCount;
/**畫筆*/
private Paint mPaint;
private int mWidth,mHeight;
public ProgressViewTest(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}
public ProgressViewTest(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}
public ProgressViewTest(Context context) {
super(context);
// TODO Auto-generated constructor stub
}
/***
* 設(shè)置最大的進(jìn)度值
* @param maxCount
*/
public void setMaxCount(float maxCount) {
this.maxCount = maxCount;
}
/**
* 得到最大進(jìn)度值
*/
public double getMaxCount(){
return maxCount;
}
/***
* 設(shè)置當(dāng)前的進(jìn)度值
* @param currentCount
*/
public void setCurrentCount(float currentCount) {
this.currentCount = currentCount > maxCount ? maxCount : currentCount;
/**
* invalidate()是用來(lái)刷新View的,必須是在UI線程中進(jìn)行工作。比如在修改某個(gè)view的顯示時(shí),
* 調(diào)用invalidate()才能看到重新繪制的界面。invalidate()的調(diào)用是把之前的舊的view從主UI
* 線程隊(duì)列中pop掉。 
*/
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
mPaint = new Paint();
//設(shè)置抗鋸齒效果
mPaint.setAntiAlias(true);
//設(shè)置畫筆顏色
mPaint.setColor(Color.BLACK);
int round = mHeight/2;
/**
* RectF:繪制矩形,四個(gè)參數(shù)分別是left,top,right,bottom
* 類型是單精度浮點(diǎn)數(shù)
*/
RectF rf = new RectF(0, 0, mWidth, mHeight);
/*繪制圓角矩形,背景色為畫筆顏色*/
canvas.drawRoundRect(rf, round, round, mPaint);
/*設(shè)置progress內(nèi)部是灰色*/
mPaint.setColor(Color.rgb(211, 211, 211));
RectF rectBlackBg = new RectF(2, 2, mWidth-2, mHeight-2);
canvas.drawRoundRect(rectBlackBg, round, round, mPaint);
//設(shè)置進(jìn)度條進(jìn)度及顏色
float section = currentCount/maxCount;
RectF rectProgressBg = new RectF(3, 3, (mWidth-3)*section, mHeight-3);
if(section!=0.0f){
mPaint.setColor(Color.GREEN);
}else{
mPaint.setColor(Color.TRANSPARENT);
}
canvas.drawRoundRect(rectProgressBg, round, round, mPaint);
}
//dip * scale + 0.5f * (dip >= 0 ? 1 : -1)
private int dipToPx(int dip){
float scale = getContext().getResources().getDisplayMetrics().density;
return (int) (dip * scale + 0.5f * (dip >= 0 ? 1 : -1));//加0.5是為了四舍五入
}
/**指定自定義控件在屏幕上的大小,onMeasure方法的兩個(gè)參數(shù)是由上一層控件
* 傳入的大小,而且是模式和尺寸混合在一起的數(shù)值,需要MeasureSpec.getMode(widthMeasureSpec)
* 得到模式,MeasureSpec.getSize(widthMeasureSpec)得到尺寸
* 
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec);
int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec);
int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec);
//MeasureSpec.EXACTLY,精確尺寸
if (widthSpecMode == MeasureSpec.EXACTLY || widthSpecMode == MeasureSpec.AT_MOST) {
mWidth = widthSpecSize;
} else {
mWidth = 0;
}
//MeasureSpec.AT_MOST,最大尺寸,只要不超過(guò)父控件允許的最大尺寸即可,MeasureSpec.UNSPECIFIED未指定尺寸
if (heightSpecMode == MeasureSpec.AT_MOST || heightSpecMode == MeasureSpec.UNSPECIFIED) {
mHeight = dipToPx(20);
} else {
mHeight = heightSpecSize;
}
//設(shè)置控件實(shí)際大小
setMeasuredDimension(mWidth, mHeight);
}
}

MainActivity.java文件

package com.example.progresstest;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class MainActivity extends ActionBarActivity {
private ProgressViewTest progress;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
progress = (ProgressViewTest) findViewById(R.id.progressbar);
progress.setMaxCount(100);
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
for (int i = 0; i <=progress.getMaxCount(); i++) {
Message msg = new Message();
msg.arg1 = i;
msg.what = 0x01;
handler.sendMessage(msg);
try {
//每隔0.1秒進(jìn)度前進(jìn)1
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}).start();
}
Handler handler = new Handler(){
public void handleMessage(Message msg) {
if(msg.what==0x01){
progress.setCurrentCount(msg.arg1);
}
};
};
}

以上所述是小編給大家介紹的Android自定義進(jìn)度條的圓角橫向進(jìn)度條實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • Android編程實(shí)現(xiàn)播放音頻的方法示例

    Android編程實(shí)現(xiàn)播放音頻的方法示例

    這篇文章主要介紹了Android編程實(shí)現(xiàn)播放音頻的方法,結(jié)合實(shí)例形式分析了Android使用MediaPlayer類播放音頻的相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • Android編程自定義線程池與用法示例

    Android編程自定義線程池與用法示例

    這篇文章主要介紹了Android編程自定義線程池與用法,結(jié)合實(shí)例形式分析了Android線程池的功能、定義及簡(jiǎn)單使用方法,需要的朋友可以參考下
    2017-12-12
  • 源碼分析Android?rinflate的使用

    源碼分析Android?rinflate的使用

    這篇文章主要將從源碼的角度帶大家一起分析Android?rinflate的使用,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的可以了解一下
    2023-04-04
  • Android對(duì)話框使用方法詳解

    Android對(duì)話框使用方法詳解

    這篇文章主要介紹了Android對(duì)話框使用方法,包括提示對(duì)話框、單選對(duì)話框、復(fù)選對(duì)話框、列表對(duì)話框等,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • Android實(shí)現(xiàn)一個(gè)簡(jiǎn)易的帶邊輸入框

    Android實(shí)現(xiàn)一個(gè)簡(jiǎn)易的帶邊輸入框

    如今市面上APP的輸入框可以說(shuō)是千奇百怪,不搞點(diǎn)花樣出來(lái)貌似代表格局沒(méi)打開,還在使用系統(tǒng)自帶的輸入框的兄弟可以停下腳步,哥帶你實(shí)現(xiàn)一個(gè)簡(jiǎn)易的帶邊框輸入框,感興趣的同學(xué)可以自己動(dòng)手試一下
    2023-08-08
  • Android ListView適配器(Adapter)優(yōu)化方法詳解

    Android ListView適配器(Adapter)優(yōu)化方法詳解

    這篇文章主要介紹了Android ListView優(yōu)化方法詳解的相關(guān)資料,這里舉例說(shuō)明該如何對(duì)ListView 進(jìn)行優(yōu)化,具有一定的參考價(jià)值,需要的朋友可以參考下
    2016-11-11
  • Android Studio 3.6 正式版終于發(fā)布了,快來(lái)圍觀

    Android Studio 3.6 正式版終于發(fā)布了,快來(lái)圍觀

    Android Studio 3.6 正式版終于發(fā)布了,值得興奮呀,畢竟 3.5 大版本更新也已經(jīng)差不多半年了,撒花撒花!這次更新又更新了什么呢?快來(lái)跟隨小編一起看看吧
    2020-02-02
  • Android開發(fā)中總結(jié)的Adapter工具類【附完整源碼下載】

    Android開發(fā)中總結(jié)的Adapter工具類【附完整源碼下載】

    這篇文章主要介紹了Android開發(fā)中總結(jié)的Adapter工具類,簡(jiǎn)單說(shuō)明了Adapter的功能,并結(jié)合實(shí)例形式分析了Adapter工具類的相關(guān)使用方法,并附帶完整源碼供讀者下載參考,需要的朋友可以參考下
    2017-11-11
  • Kotlin try catch異常處理i詳解

    Kotlin try catch異常處理i詳解

    在 Kotlin 協(xié)程當(dāng)中,我們通常把異常分為兩大類,一類是取消異常(CancellationException),另一類是其他異常。在 Kotlin 協(xié)程當(dāng)中,這兩種異常的處理方式是不一樣的
    2022-11-11
  • Android中bindService基本使用方法概述

    Android中bindService基本使用方法概述

    這篇文章主要介紹了Android中bindService基本使用方法,詳細(xì)解釋了bindService的基本使用概述及其生命周期,需要的朋友可以參考下
    2015-12-12

最新評(píng)論