最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義View實(shí)現(xiàn)簡(jiǎn)單的圓形Progress效果

 更新時(shí)間:2016年09月03日 08:51:57   作者:Rabbit丶  
這篇文章主要介紹了Android自定義View實(shí)現(xiàn)簡(jiǎn)單的圓形Progress效果的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下

先給大家展示下效果圖,如果感覺不錯(cuò),請(qǐng)參考實(shí)現(xiàn)思路:

我們要實(shí)現(xiàn)一個(gè)自定義的再一個(gè)圓形中繪制一個(gè)弧形的自定義View,思路是這樣的:

  先要?jiǎng)?chuàng)建一個(gè)類ProgressView,繼承自View類,然后重寫其中的兩個(gè)構(gòu)造方法,一個(gè)是一個(gè)參數(shù)的,一個(gè)是兩個(gè)參數(shù)的,因?yàn)槲覀円趚ml文件中使用該自定義控件,所以必須要定義這個(gè)兩個(gè)參數(shù)的構(gòu)造函數(shù)。創(chuàng)建完了這個(gè)類后,我們先不去管它,先考慮我們實(shí)現(xiàn)的這個(gè)自定義View,我們想讓它的哪些部分可以由使用者自己指定,比如說這個(gè)Demo中我們讓他的外面圓的外邊框顏色和寬度,還有扇形部分的顏色,扇形增長(zhǎng)的速度等等屬性,這時(shí)候我們要在項(xiàng)目工程目錄的res/values目錄下創(chuàng)建一個(gè)資源文件命名為attrs(注意,名字隨意,只是大多數(shù)情況下都這么叫而已),然后我們?cè)谶@個(gè)資源文件中添加我們想要的屬性,如下:

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ProgressView">
<!--circleColor 設(shè)置圓形邊框的顏色 sweepColor設(shè)置扇形變換的顏色
startAngle 設(shè)置起始角度 sweepStep 設(shè)置變換的步長(zhǎng)-->
<attr name="circleColor" format="color|reference"></attr>
<attr name="sweepColor" format="color|reference"></attr>
<attr name="startAngle" format="integer"></attr>
<attr name="sweepStep" format="integer"></attr>
<attr name="padding" format="integer"></attr>
</declare-styleable>
</resources>

可以看到,<declare-styleable>標(biāo)簽中的name屬性是為了方便我們獲取AttributeSet時(shí)候使用,而<attr>標(biāo)簽中name,則是我們希望控件可以自定義的屬性部分,類似于xml文件中的android:name=""等標(biāo)簽的使用。format屬性是設(shè)置該屬性可以接受什么類型的參數(shù)。

定義好了自定義資源類,我們開始寫ProgressView中的主要代碼:

package com.yztc.customprogressview;
import android.content.Context;
import android.content.res.TypedArray;
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 ProgressView extends View {
private int sweepStep = 10;//扇形變換的步長(zhǎng)(就是角度)
private int padding = 40;//外邊框距離扇形的距離 填充
private int circleColor = Color.GRAY;//邊框的顏色
private int sweepColor = Color.BLUE;//扇形顏色
private int startAngle = 90;//起始角度
//設(shè)置外邊框圓的邊框粗細(xì)
private int storke = 20;
private int sweepAngle = 0;//掃過的角度
private static final int DEFAULT_WIDTH = 200;
private static final int DEFAULT_HEIGHT = 200;
public ProgressView(Context context) {
super(context);
}
//如果要在xml文件中使用該自定義控件,則必須重寫兩個(gè)參數(shù)的構(gòu)造函數(shù)
//因?yàn)槲覀兪褂米远x的屬性的時(shí)候,會(huì)默認(rèn)傳遞過來一個(gè)AttributeSet集合
public ProgressView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ProgressView);
if (array != null) {
//獲取我們?cè)趚ml中設(shè)置的各個(gè)自定義屬性
sweepStep = array.getInteger(R.styleable.ProgressView_sweepStep, sweepStep);
padding = array.getInteger(R.styleable.ProgressView_padding, padding);
circleColor = array.getColor(R.styleable.ProgressView_circleColor, circleColor);
sweepColor = array.getColor(R.styleable.ProgressView_sweepColor, sweepColor);
startAngle = array.getInteger(R.styleable.ProgressView_startAngle, startAngle);
//回收TypeArray資源
array.recycle();
}
}
/**
* 先繪制外邊框 --內(nèi)部扇形
*
* @param canvas
*/
@Override
protected void onDraw(Canvas canvas) {
Paint mPaint = new Paint();
mPaint.setAntiAlias(true); //設(shè)置抗鋸齒
//繪制外層的圓框
mPaint.setColor(circleColor);
mPaint.setStrokeWidth(storke);
mPaint.setStyle(Paint.Style.STROKE);//設(shè)置圓形為空心的圓
//這里我們得到控件的Height和Width,根據(jù)Heigh和Width來確定圓心的位置,來繪制外層圓
canvas.drawCircle(getWidth() / 2, getWidth() / 2, getWidth() / 2 - storke / 2, mPaint);
// Log.d("tag", "onDraw: "+getWidth());
invalidate();//請(qǐng)求重新繪制view
//繪制內(nèi)部的扇形
mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
mPaint.setColor(sweepColor);
/*
drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,Paint paint)
RectF oval 指定扇形的矩形容器對(duì)象 指定圓弧的外輪廓的矩形
float startAngle 表示圓弧的起始角度
float sweepAngle 表示圓弧走過掃過的角度 順時(shí)針方向
boolean useCenter 如果設(shè)置為true 在繪制圓弧時(shí)將圓心包括在內(nèi),是指以一個(gè)固定的圓心來繪制弧形(扇形),
如果指定為false,則不規(guī)則繪制扇形
Paint paint 畫筆 顏色 填充
public RectF(float left, float top, float right, float bottom)
float left 矩形的左邊點(diǎn)(左切點(diǎn))的x坐標(biāo)
float top 矩形上邊點(diǎn)(上切點(diǎn))的y軸坐標(biāo)
float right, 矩形的右邊點(diǎn)(右切點(diǎn))的x坐標(biāo)
float bottom 矩形的下邊點(diǎn)(下切點(diǎn))的y坐標(biāo)
*/
//RectF中的四個(gè)參數(shù),分別對(duì)應(yīng)其內(nèi)切圓的四個(gè)切點(diǎn)的坐標(biāo)
RectF rectF = new RectF(padding + storke, padding + storke, getWidth() - padding - storke, getWidth() - padding - storke);
canvas.drawArc(rectF, startAngle, sweepAngle, true, mPaint);
sweepAngle += sweepStep;//根據(jù)步長(zhǎng)更新掃過的角度
sweepAngle = sweepAngle > 360 ? 0 : sweepAngle;
invalidate();//重繪view
}
//因?yàn)槲覀兪抢^承的View來自定義的View,所以onMeasure()方法要重寫
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int wMode = MeasureSpec.getMode(widthMeasureSpec);
int hMode = MeasureSpec.getMode(heightMeasureSpec);
int wSize = MeasureSpec.getSize(widthMeasureSpec);
int hSize = MeasureSpec.getSize(heightMeasureSpec);
//因?yàn)槔L制的是圓,所以判斷一下高度或者寬度中的一個(gè)就可以。
switch (wMode) {
case MeasureSpec.AT_MOST://android:layout_width="warp_content"
//獲取屏幕像素
float density = getResources().getDisplayMetrics().density;
wSize = (int) (DEFAULT_WIDTH * density);
hSize = (int) (DEFAULT_HEIGHT * density);
break;
//當(dāng)在xml中指定控件的寬高為match_parent或者指定數(shù)值的寬高時(shí),回調(diào)以下代碼
case MeasureSpec.EXACTLY://android:layout_width="match_parent" android:layout_width="40dp"
wSize = hSize = Math.min(wSize, hSize);
break;
}
//只要重寫onMeasure()方法,一定要調(diào)用以下方法,不然會(huì)報(bào)錯(cuò)
setMeasuredDimension(wSize, hSize);
}
}

我們先畫一個(gè)外部的圓,也就是都用drawCircle()方法,這里我們調(diào)用getWidth(),getHeight()表示得到布局中設(shè)置的控件的尺寸,因?yàn)槭菆A,所以可以使用getWidth()/2來表示圓心位置。而畫內(nèi)部弧形的時(shí)候,確定其圓心位置,左部點(diǎn)的坐標(biāo)是外面圓的邊框加上弧形與原的間距padding來確定,右側(cè)點(diǎn)的x坐標(biāo)則是getWidth()得到總長(zhǎng)度,減去邊框?qū)挾龋贉p去padding得到,上邊距和下邊距同樣,不明白的畫一個(gè)圖立馬明白。大部分不好理解的地方都有注釋,只要認(rèn)真看不會(huì)看不明白的~

然后就是在布局中引入我們的自定義View了:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.yztc.customprogressview.MainActivity">
<com.yztc.customprogressview.ProgressView
android:id="@+id/pv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#0000ff"
app:padding="20"
app:circleColor="#aa0000"
app:sweepColor="#00aa00"
app:sweepStep="1"
app:startAngle="180"
/>
</RelativeLayout>

需要注意的是我們需要在布局的跟標(biāo)簽下面加上這么一段代碼:xmlns:app="http://schemas.android.com/apk/res-auto"

用來指定我們可以使用自己再attrs中自定義的屬性啦~,使用的形式就是app:你定義的屬性。當(dāng)然,這個(gè)app也不是固定的寫法,只要跟上面你加的那段代碼的xmlns后面的字段一致就可以了~

還有需要注意的是:

默認(rèn)使用Canvas類的drawCircle()方法來畫圓的時(shí)候,圓的半徑是你指定的半徑,再加上一半的邊長(zhǎng),比如你的邊框size=10,radius=50,則實(shí)際空心部分的半徑為55.注意這點(diǎn),否則畫出來的圓的四個(gè)切點(diǎn)位置會(huì)與其他位置有些不一樣,類似出現(xiàn)鋸齒的效果。具體請(qǐng)看drawCircle()的Rect邊框問題。

以上所述是小編給大家介紹的Android自定義View實(shí)現(xiàn)簡(jiǎn)單的圓形Progress效果,希望對(duì)大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!

相關(guān)文章

  • Android開發(fā)教程之調(diào)用攝像頭功能的方法詳解

    Android開發(fā)教程之調(diào)用攝像頭功能的方法詳解

    這篇文章主要介紹了Android調(diào)用攝像頭功能的方法,詳細(xì)分析了Android調(diào)用攝像頭功能的權(quán)限設(shè)置、功能代碼與實(shí)現(xiàn)步驟,需要的朋友可以參考下
    2016-06-06
  • Android 畫中畫模式的實(shí)現(xiàn)示例

    Android 畫中畫模式的實(shí)現(xiàn)示例

    這篇文章主要介紹了Android 畫中畫模式的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Android開發(fā)TextView內(nèi)的文字實(shí)現(xiàn)自動(dòng)換行

    Android開發(fā)TextView內(nèi)的文字實(shí)現(xiàn)自動(dòng)換行

    這篇文章主要為大家介紹了Android開發(fā)TextView內(nèi)的文字實(shí)現(xiàn)自動(dòng)換行,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Android實(shí)現(xiàn)多點(diǎn)觸控,自由縮放圖片的實(shí)例代碼

    Android實(shí)現(xiàn)多點(diǎn)觸控,自由縮放圖片的實(shí)例代碼

    本篇文章主要介紹了Android實(shí)現(xiàn)多點(diǎn)觸控,自由縮放圖片的實(shí)例代碼,可以自由地對(duì)圖片進(jìn)行縮放和移動(dòng),非常具有實(shí)用價(jià)值,需要的朋友可以參考下。
    2016-12-12
  • Android實(shí)現(xiàn)下拉刷新的視圖和圖標(biāo)的旋轉(zhuǎn)

    Android實(shí)現(xiàn)下拉刷新的視圖和圖標(biāo)的旋轉(zhuǎn)

    本篇文章主要介紹了Android實(shí)現(xiàn)下拉刷新的視圖和圖標(biāo)的旋轉(zhuǎn)的實(shí)例,具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • Kotlin中常見內(nèi)聯(lián)擴(kuò)展函數(shù)的使用方法教程

    Kotlin中常見內(nèi)聯(lián)擴(kuò)展函數(shù)的使用方法教程

    在Kotlin中,使用inline修飾符標(biāo)記內(nèi)聯(lián)函數(shù),既會(huì)影響到函數(shù)本身, 也影響到傳遞給它的Lambda表達(dá)式,這兩者都會(huì)被內(nèi)聯(lián)到調(diào)用處。下面這篇文章主要給大家介紹了關(guān)于Kotlin中常見內(nèi)聯(lián)擴(kuò)展函數(shù)的使用方法,需要的朋友可以參考下。
    2017-12-12
  • Android中懸浮窗口的實(shí)現(xiàn)原理實(shí)例分析

    Android中懸浮窗口的實(shí)現(xiàn)原理實(shí)例分析

    這篇文章主要介紹了Android中懸浮窗口的實(shí)現(xiàn)原理,以實(shí)例形式較為詳細(xì)的分析了Android懸浮窗口的原理與具體實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Android基于OkHttp實(shí)現(xiàn)下載和上傳圖片

    Android基于OkHttp實(shí)現(xiàn)下載和上傳圖片

    這篇文章主要為大家詳細(xì)介紹了Android基于OkHttp實(shí)現(xiàn)下載和上傳圖片功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-11-11
  • Android Studio配置(Android Studio4.1為例)

    Android Studio配置(Android Studio4.1為例)

    這篇文章主要介紹了Android Studio配置(Android Studio4.1為例),文中通過圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • Android通過代碼控制ListView上下滾動(dòng)的方法

    Android通過代碼控制ListView上下滾動(dòng)的方法

    今天小編就為大家分享一篇關(guān)于Android通過代碼控制ListView上下滾動(dòng)的方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12

最新評(píng)論

庆安县| 两当县| 锡林郭勒盟| 承德市| 吉首市| 河北省| 镇康县| 磐石市| 枣庄市| 河池市| 财经| 武清区| 潞城市| 马尔康县| 五河县| 隆化县| 台北县| 长寿区| 昆明市| 百色市| 拜城县| 西峡县| 乐亭县| 文登市| 辉县市| 郸城县| 高邮市| 琼中| 上思县| 尉氏县| 霍州市| 德州市| 洱源县| 麻江县| 将乐县| 双牌县| 涿州市| 株洲市| 滨州市| 太仆寺旗| 武川县|