Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android自定義控件(實現視圖樹繪制指示器)

Android自定義控件(實現視圖樹繪制指示器)

編輯:關於Android編程

之前寫輪播條或者指示器的時候都是UI圖裡面直接有,這樣的效果並不好,給用戶的體驗比較差,所以閒暇之余自己寫了個指示器,可以展現出一個優雅的效果,當手指 當手指滑動的時候小圓點會跟著一點一點的滑動,當手指停下時,小紅點也跟著停下來。首先我說說我實現的這個原理吧

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

1、使用LayParams給布局裡面添加未選中的小圓點,例如灰色;

2、設置小紅點,表示滑動後的狀態。

3、獲取小圓點之間的距離,這裡要獲取小圓點的距離不能簡單地getWidth,getHeiget,這樣是獲取不到的 ,這裡要用到視圖樹來觀察兩個點距離左側屏幕之間的距離,然後求差獲取距離。

4、在監聽viewpager的時候獲取兩者的距離。

代碼如下:

一、布局文件

<!--小紅點,小圓點的滑動,具體布局在代碼裡面寫的--> 
<?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="開始體驗" 
android:visibility="gone"/> 
<!--小紅點,小圓點的滑動,具體布局在代碼裡面寫的--> 
<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> 
<!--普通的圓點--> 
<?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> 
<!--小紅點的圓點--> 
<?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的數據 
*/ 
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]); //只有設置了背景才能填充滿屏幕 
mList.add(view); 
//設置,灰色的小圓點,表示滑動時候的狀態 
View point = new View(this); 
point.setBackgroundResource(R.drawable.shape_guide_point_default); //設置背景 
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); 
} 
} 

三、獲取小紅點之間的距離

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

四、讓小紅點聯動

/** 
* viewpager的頁面滑動的監聽 
*/ 
private void initScrollListen() { 
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { 
//當頁面被滑動的時候 
//參數一:當前頁面的位置 參數二:偏移的百分比 參數三:偏移的距離 
@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); 
} 
//當頁面被選擇 
@Override 
public void onPageSelected(int position) { 
} 
//當頁面狀態改變的時候 
@Override 
public void onPageScrollStateChanged(int state) { 
} 
}); 
} 

以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持本站!

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved