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);
}
}
효과 그림:프로젝트
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.