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

Android自定義控件(實(shí)現(xiàn)視圖樹繪制指示器)

 更新時(shí)間:2017年01月10日 11:07:53   作者:一杯清泉  
本文主要介紹了Android視圖樹繪制指示器的實(shí)現(xiàn)原理和具體步驟。具有一定的參考價(jià)值,下面跟著小編一起來看下吧

之前寫輪播條或者指示器的時(shí)候都是UI圖里面直接有,這樣的效果并不好,給用戶的體驗(yàn)比較差,所以閑暇之余自己寫了個(gè)指示器,可以展現(xiàn)出一個(gè)優(yōu)雅的效果,當(dāng)手指 當(dāng)手指滑動的時(shí)候小圓點(diǎn)會跟著一點(diǎn)一點(diǎn)的滑動,當(dāng)手指停下時(shí),小紅點(diǎn)也跟著停下來。首先我說說我實(shí)現(xiàn)的這個(gè)原理吧

首先在布局文件里面寫上線性布局,表示底部的小圓點(diǎn),方向和位置,然后再在shape里面自繪小圓點(diǎn)。再在代碼里面里用布局寫出,具體步驟如下:

1、使用LayParams給布局里面添加未選中的小圓點(diǎn),例如灰色;

2、設(shè)置小紅點(diǎn),表示滑動后的狀態(tài)。

3、獲取小圓點(diǎn)之間的距離,這里要獲取小圓點(diǎn)的距離不能簡單地getWidth,getHeiget,這樣是獲取不到的 ,這里要用到視圖樹來觀察兩個(gè)點(diǎn)距離左側(cè)屏幕之間的距離,然后求差獲取距離。

4、在監(jiān)聽viewpager的時(shí)候獲取兩者的距離。

代碼如下:

一、布局文件

<!--小紅點(diǎn),小圓點(diǎn)的滑動,具體布局在代碼里面寫的--> 
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 
<android.support.v4.view.ViewPager 
android:id="@+id/vp_pager" 
android:layout_width="match_parent" 
android:layout_height="match_parent"/> 
<Button 
android:id="@+id/btn_start" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true" 
android:layout_centerHorizontal="true" 
android:layout_marginBottom="60dp" 
android:background="#FFF107" 
android:paddingLeft="10dp" 
android:paddingRight="10dp" 
android:textSize="20sp" 
android:text="開始體驗(yàn)" 
android:visibility="gone"/> 
<!--小紅點(diǎn),小圓點(diǎn)的滑動,具體布局在代碼里面寫的--> 
<RelativeLayout 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true" 
android:layout_centerHorizontal="true" 
android:layout_marginBottom="20dp"> 
<LinearLayout 
android:id="@+id/ll_point_group" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:orientation="horizontal"> 
</LinearLayout> 
<View 
android:id="@+id/view_red_point" 
android:layout_width="10dp" 
android:layout_height="10dp" 
android:background="@drawable/shape_guide_point_selected"/> 
</RelativeLayout> 
</RelativeLayout> 
<!--普通的圓點(diǎn)--> 
<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="oval" > 
<solid android:color="@android:color/darker_gray" /> 
</shape> 
<!--小紅點(diǎn)的圓點(diǎn)--> 
<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="oval" > 
<solid android:color="#f00" /> 
</shape> 

二、代碼

/** 
* 初始化viewpager的數(shù)據(jù) 
*/ 
private void initView() { 
int[] icons = {R.mipmap.guide1,R.mipmap.guide2,R.mipmap.guide3,R.mipmap.guide4}; 
mList = new ArrayList<>(); 
for (int i = 0; i < icons.length; i++) { 
ImageView view = new ImageView(this); 
view.setBackgroundResource(icons[i]); //只有設(shè)置了背景才能填充滿屏幕 
mList.add(view); 
//設(shè)置,灰色的小圓點(diǎn),表示滑動時(shí)候的狀態(tài) 
View point = new View(this); 
point.setBackgroundResource(R.drawable.shape_guide_point_default); //設(shè)置背景 
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(DensityUtils.dp2px(this,10), DensityUtils.dp2px(this,10)); 
point.setLayoutParams(params); 
if (i != 0) { 
params.leftMargin = DensityUtils.dp2px(this, 10); 
} 
llpointGroup.addView(point); 
} 
} 

三、獲取小紅點(diǎn)之間的距離

/** 
* 初始化小紅點(diǎn)之間的距離 
*/ 
private void initPoint() { 
// measure -> layout -> draw 
viewRedPoint.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
//完成布局后回調(diào)該方法,該方法有可能被多次回調(diào) 
@Override 
public void onGlobalLayout() { 
viewRedPoint.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
mPointWidth = llpointGroup.getChildAt(1).getLeft() - llpointGroup.getChildAt(0).getLeft(); 
} 
}); 
} 

四、讓小紅點(diǎn)聯(lián)動

/** 
* viewpager的頁面滑動的監(jiān)聽 
*/ 
private void initScrollListen() { 
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
//當(dāng)頁面被滑動的時(shí)候 
//參數(shù)一:當(dāng)前頁面的位置 參數(shù)二:偏移的百分比 參數(shù)三:偏移的距離 
@Override 
public void onPageScrolled(int position,float positionOffset,int positionOffsetPixels) { 
int leftMargin = (int) (mPointWidth * (position + positionOffset)); 
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) viewRedPoint.getLayoutParams(); 
lp.leftMargin = leftMargin; 
viewRedPoint.setLayoutParams(lp); 
} 
//當(dāng)頁面被選擇 
@Override 
public void onPageSelected(int position) { 
} 
//當(dāng)頁面狀態(tài)改變的時(shí)候 
@Override 
public void onPageScrollStateChanged(int state) { 
} 
}); 
} 

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • Android源碼學(xué)習(xí)之觀察者模式應(yīng)用及優(yōu)點(diǎn)介紹

    Android源碼學(xué)習(xí)之觀察者模式應(yīng)用及優(yōu)點(diǎn)介紹

    定義對象間一種一對多的依賴關(guān)系,使得當(dāng)一個(gè)對象改變狀態(tài),則所有依賴于它的對象都會得到通知并被自動更新等等,需要了解的朋友可以參考下
    2013-01-01
  • Flutter項(xiàng)目在 iOS14 啟動崩潰的解決方法

    Flutter項(xiàng)目在 iOS14 啟動崩潰的解決方法

    這篇文章主要介紹了Flutter項(xiàng)目在 iOS14 啟動崩潰的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 一篇文章就能了解Rxjava

    一篇文章就能了解Rxjava

    最近偶然接觸到了rxjava。關(guān)于rxjava,褒貶不一,有人說好用,有人說難用,不過它到底是什么?它有什么用?接下來,本文通過部分代碼及分析,向大家介紹rxjava及其相關(guān)內(nèi)容。
    2017-10-10
  • Android ADT和SDK Manager無法更新下載解決方案

    Android ADT和SDK Manager無法更新下載解決方案

    這篇文章主要介紹了Android ADT和SDK Manager無法更新下載解決方案的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • Android文件操作工具類詳解

    Android文件操作工具類詳解

    這篇文章主要為大家詳細(xì)介紹了Android文件操作工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Android結(jié)合kotlin使用coroutine的方法實(shí)例

    Android結(jié)合kotlin使用coroutine的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Android結(jié)合kotlin使用coroutine的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • Android實(shí)現(xiàn)志愿者系統(tǒng)詳細(xì)步驟與代碼

    Android實(shí)現(xiàn)志愿者系統(tǒng)詳細(xì)步驟與代碼

    這篇文章主要介紹了Android實(shí)現(xiàn)志愿者系統(tǒng),本系統(tǒng)采用MVC架構(gòu)設(shè)計(jì),SQLite數(shù)據(jù)表有用戶表、成員表和活動表,有十多個(gè)Activity頁面。打開應(yīng)用,進(jìn)入歡迎界面,3s后跳轉(zhuǎn)登錄界面,用戶先注冊賬號,登錄成功后進(jìn)入主界面
    2023-02-02
  • Android Studio的中文亂碼問題解決方法

    Android Studio的中文亂碼問題解決方法

    Android Studio安裝后發(fā)現(xiàn)所有的中文,不管是界面上的還是輸出的log中的中文都變成小框框,具體的解決方法如下,感興趣的朋友可以參考下哈
    2013-06-06
  • Android實(shí)現(xiàn)音頻條形圖效果

    Android實(shí)現(xiàn)音頻條形圖效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)音頻條形圖效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • Android使用Volley框架定制PostUploadRequest上傳文件

    Android使用Volley框架定制PostUploadRequest上傳文件

    這篇文章主要為大家詳細(xì)介紹了Android使用Volley框架定制PostUploadRequest上傳文件或圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12

最新評論

宜兴市| 尉犁县| 通城县| 龙门县| 元朗区| 西平县| 海南省| 方正县| 汝南县| 青岛市| 茂名市| 普兰县| 中宁县| 莫力| 连南| 丹阳市| 东乌珠穆沁旗| 法库县| 石首市| 襄樊市| 镇赉县| 西贡区| 蚌埠市| 辽阳县| 随州市| 汉川市| 宣汉县| 筠连县| 陇西县| 务川| 青浦区| 西青区| 竹溪县| 鹤壁市| 涟水县| 临西县| 如皋市| 乌什县| 旅游| 赣州市| 墨竹工卡县|