国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android自定義控件ViewGroup實現標簽云

2019-10-22 18:10:19
字體:
來源:轉載
供稿:網友

本文實例為大家分享了Android自定義控件ViewGroup實現標簽云的具體代碼,供大家參考,具體內容如下

實現的功能:

Android,自定義控件,ViewGroup,標簽云

基本繪制流程:

構造函數獲取自定義屬性 
onMeasure()方法,測量子控件的大小 
onLayout()方法,對子控件進行布局

1、自定義屬性

<resources>  <declare-styleable name="TabsViewGroup">    <attr name="tabVerticalSpace" format="dimension" />    <attr name="tabHorizontalSpace" format="dimension" />  </declare-styleable></resources>

2、構造函數中獲取自定義屬性值

public TabsViewGroup(Context context, AttributeSet attrs) {    super(context, attrs);    TypedArray attrArray = context.obtainStyledAttributes(attrs, R.styleable.TabsViewGroup);    if (attrArray != null) {      childHorizontalSpace = attrArray.getDimensionPixelSize(R.styleable.TabsViewGroup_tabHorizontalSpace, 0);      childVerticalSpace = attrArray.getDimensionPixelSize(R.styleable.TabsViewGroup_tabHorizontalSpace, 0);      attrArray.recycle();    }  }

3、onMeasure函數測量子控件大小,然后設置當前控件大小

 

 @Override  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {    int widthSize = MeasureSpec.getSize(widthMeasureSpec);    int heightSize = MeasureSpec.getSize(heightMeasureSpec);    int widthModel = MeasureSpec.getMode(widthMeasureSpec);    int heightModel = MeasureSpec.getMode(heightMeasureSpec);    //輸出寬度高度以及測量模式    Log.i(TAG, "sizeWidth :" + widthSize);    switch (widthModel) {      case MeasureSpec.AT_MOST:        Log.i(TAG, "Width model AT_MOST");        break;      case MeasureSpec.EXACTLY:        Log.i(TAG, "Width model EXACTLY");        break;      case MeasureSpec.UNSPECIFIED:        Log.i(TAG, "Width model UNSPECIFIED");        break;    }    Log.i(TAG, "sizeHeight :" + heightSize);    switch (heightModel) {      case MeasureSpec.AT_MOST:        Log.i(TAG, "Height model AT_MOST");        break;      case MeasureSpec.EXACTLY:        Log.i(TAG, "Height model EXACTLY");        break;      case MeasureSpec.UNSPECIFIED:        Log.i(TAG, "Height model UNSPECIFIED");        break;    }    //左右邊距    int left = getPaddingLeft();    int top = getPaddingTop();    //記錄每一行的寬度和高度    int lineWidth = 0;    int lineHeight = 0;    // 如果是warp_content情況下,記錄寬和高    int containerWidth = 0;    int containerHeight = 0;    // 遍歷每個子元素    for (int index = 0; index < getChildCount(); index++) {      View child = getChildAt(index);      if (child.getVisibility() == GONE) {        continue;      }      measureChild(child, widthMeasureSpec, heightMeasureSpec);      MarginLayoutParams params = (MarginLayoutParams) child.getLayoutParams();      int childWidth = child.getMeasuredWidth() + params.leftMargin + params.rightMargin + childHorizontalSpace;      int childHeight = child.getMeasuredHeight() + params.topMargin + params.bottomMargin + childVerticalSpace;      if (lineWidth + childWidth > widthSize - getPaddingRight() - getPaddingLeft()) {        containerWidth = Math.max(lineWidth, childWidth);        lineWidth = childWidth;        containerHeight += lineHeight;        lineHeight = childHeight;        Rect rect = new Rect(left,            containerHeight + top,            left + childWidth - childHorizontalSpace,            containerHeight + top + child.getMeasuredHeight());        child.setTag(rect);      } else {        Rect rect = new Rect(lineWidth + left,            containerHeight + top,            lineWidth + left + childWidth - childHorizontalSpace,            containerHeight + top + child.getMeasuredHeight());        child.setTag(rect);        lineWidth += childWidth;        lineHeight = Math.max(lineHeight, childHeight);      }    }    containerWidth = Math.max(containerWidth, lineWidth) + getPaddingLeft() + getPaddingRight();    containerHeight += lineHeight + getPaddingTop() + getPaddingBottom();    containerHeight -= childVerticalSpace;    setMeasuredDimension(widthModel == MeasureSpec.EXACTLY ? widthSize : containerWidth,        heightModel == MeasureSpec.EXACTLY ? heightSize : containerHeight);}

4、onLayout函數對所有子控件重新布局

@Override  protected void onLayout(boolean changed, int l, int t, int r, int b) {    int childCount = getChildCount();    for (int i = 0; i < childCount; i++) {      View child = getChildAt(i);      if (child.getVisibility() == GONE) {        continue;      }      Rect location = (Rect) child.getTag();      child.layout(location.left, location.top, location.right, location.bottom);    }}

使用方法

1、布局問自己中直接引用

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:owen="http://schemas.android.com/apk/res-auto"  android:id="@+id/activity_main"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:background="#ffffff"  android:orientation="vertical">  <TextView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:padding="10dp"    android:textSize="16sp"    android:text="國際足球"/>  <View    android:layout_width="wrap_content"    android:layout_height="0.1dp"    android:background="#e0e0e0"/>  <com.ownchan.tabviewgroup.view.TabsViewGroup    android:id="@+id/tabs_view"    android:layout_width="match_parent"    android:layout_height="wrap_content"    android:padding="10dip"    owen:tabHorizontalSpace="10dp"    owen:tabVerticalSpace="10dp" /></LinearLayout>

2、代碼添加標簽

@Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    initView();  }  private void initView() {    TabsViewGroup tabsViewGroup = (TabsViewGroup) findViewById(R.id.tabs_view);    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,        ViewGroup.LayoutParams.WRAP_CONTENT);    String[] tabs = new String[]{"世預賽歐洲區",        "世預賽南美區", "五人世界杯", "意甲", "美國大聯盟", "烏超", "英冠", "國際冠軍杯", "巴西圣保羅州杯", "巴西杯"};    for (int i = 0; i < tabs.length; i++) {      TextView textView = new TextView(this);      textView.setText(tabs[i]);      textView.setTextColor(Color.WHITE);      textView.setBackgroundDrawable(getResources().getDrawable(R.drawable.tabs_bg));      textView.setGravity(Gravity.CENTER);      textView.setPadding(10, 0, 10, 0);      textView.setTextSize(16);      tabsViewGroup.addView(textView, params);    }}

效果圖:

Android,自定義控件,ViewGroup,標簽云

項目Github地址

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 泸定县| 鄄城县| 米泉市| 江门市| 怀远县| 龙海市| 田阳县| 宾川县| 大邑县| 尉犁县| 通州区| 贵溪市| 望都县| 大庆市| 宿州市| 肇东市| 略阳县| 台南市| 合作市| 衡南县| 本溪| 秭归县| 铁岭县| 永兴县| 富平县| 丽水市| 阿克苏市| 梨树县| 景泰县| 济南市| 丘北县| 武汉市| 沙洋县| 张家界市| 桂阳县| 宜川县| 卢湾区| 广州市| 永和县| 宁陕县| 玛曲县|