Android,타 오 바 오 에서 상품 사 이 즈 를 선택 한 단추 그룹 인 스 턴 스 구현
이제 안에 있 는 원리 들 을 말씀 드 리 겠 습 니 다!
1.원리:
1.사실 여기 서 우리 가 사용 하 는 것 은
ViewGroup
컨트롤 그룹 입 니 다.이 버튼 을 넣 으 면 이런 효과 가 있 습 니 다!그러나 여기 에는 ViewGroup
(GoodsViewGroup
)을 계승 하여 안에 있 는 몇 가지 방법 을 다시 써 야 한다.2.주요 한 방법 은 다음 과 같다.
GoodsView Group 단추 그룹의 컨트롤 크기
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
안에 있 는 버튼 마다 위치 좌표.
protected void onLayout(boolean changed, int l, int t, int r, int b)
이 두 가지 방법의 구체 적 인 사용 은 여러분 이 인터넷 에서 자 료 를 찾 아 볼 수 있 습 니 다.여 기 는 더 이상 말 하지 않 겠 습 니 다!2.코드:
/**
* Created by ShaoLin on 2016/8/22.
* ( button,textview)
*/
public class GoodsViewGroup<X extends TextView> extends ViewGroup {
public static final String BTN_MODE = "BTNMODE"; //
public static final String TEV_MODE = "TEVMODE"; //
private static final String TAG = "IViewGroup";
private final int HorInterval = 10; //
private final int VerInterval = 10; //
private int viewWidth; //
private int viewHeight; //
private ArrayList<String> mTexts = new ArrayList<>();
private Context mContext;
private int textModePadding = 15;
//
private float itemTextSize = 18;
private int itemBGResNor = R.drawable.goods_item_btn_normal;
private int itemTextColorNor = Color.parseColor("#000000");
//
private int itemBGResPre = R.drawable.goods_item_btn_selected;
private int itemTextColorPre = Color.parseColor("#ffffff");
public GoodsViewGroup(Context context) {
this(context, null);
}
public GoodsViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
}
/**
*
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
viewWidth = measureWidth(widthMeasureSpec);
viewHeight = measureHeight(heightMeasureSpec);
Log.e(TAG, "onMeasure:" + viewWidth + ":" + viewHeight);
// ViewGroup
measureChildren(widthMeasureSpec, heightMeasureSpec);
// MyViewGroup
setMeasuredDimension(viewWidth, getViewHeight());
}
private int measureWidth(int pWidthMeasureSpec) {
int result = 0;
int widthMode = MeasureSpec.getMode(pWidthMeasureSpec);
int widthSize = MeasureSpec.getSize(pWidthMeasureSpec);
switch (widthMode) {
/**
* mode , MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY,
* MeasureSpec.AT_MOST。
*
*
* MeasureSpec.EXACTLY ,
* layout_width layout_height andorid
* :layout_width="50dip", FILL_PARENT , , 。
*
*
* MeasureSpec.AT_MOST ,
* layout_width layout_height WRAP_CONTENT
* , ,
* 。 , mode AT_MOST,size 。
*
*
* MeasureSpec.UNSPECIFIED , , AdapterView,
* measure 。
*/
case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:
result = widthSize;
break;
}
return result;
}
private int measureHeight(int pHeightMeasureSpec) {
int result = 0;
int heightMode = MeasureSpec.getMode(pHeightMeasureSpec);
int heightSize = MeasureSpec.getSize(pHeightMeasureSpec);
switch (heightMode) {
case MeasureSpec.UNSPECIFIED:
result = getSuggestedMinimumHeight();
break;
case MeasureSpec.AT_MOST:
case MeasureSpec.EXACTLY:
result = heightSize;
break;
}
return result;
}
/**
* onLayout, , onMeasure , ,
*
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
//
int posLeft = HorInterval;
int posTop = VerInterval;
int posRight;
int posBottom;
for (int i = 0; i < getChildCount(); i++) {
View childView = getChildAt(i);
// onMeasure
int measureHeight = childView.getMeasuredHeight();
int measuredWidth = childView.getMeasuredWidth();
if (posLeft + getNextHorLastPos(i) > viewWidth) {
posLeft = HorInterval;
posTop += (measureHeight + VerInterval);
}
posRight = posLeft + measuredWidth;
posBottom = posTop + measureHeight;
childView.layout(posLeft, posTop, posRight, posBottom);
posLeft += (measuredWidth + HorInterval);
}
}
//
private int getViewHeight() {
int viewwidth = HorInterval;
int viewheight = VerInterval;
if (getChildCount() > 0) {
viewheight = getChildAt(0).getMeasuredHeight() + VerInterval;
}
for (int i = 0; i < getChildCount(); i++) {
View childView = getChildAt(i);
// onMeasure
int measureHeight = childView.getMeasuredHeight();
int measuredWidth = childView.getMeasuredWidth();
if (viewwidth + getNextHorLastPos(i) > viewWidth) {
viewwidth = HorInterval;
viewheight += (measureHeight + VerInterval);
} else {
viewwidth += (measuredWidth + HorInterval);
}
}
return viewheight;
}
private int getNextHorLastPos(int i) {
return getChildAt(i).getMeasuredWidth() + HorInterval;
}
private OnGroupItemClickListener onGroupItemClickListener;
public void setGroupClickListener(OnGroupItemClickListener listener) {
onGroupItemClickListener = listener;
for (int i = 0; i < getChildCount(); i++) {
final X childView = (X) getChildAt(i);
final int itemPos = i;
childView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
onGroupItemClickListener.onGroupItemClick(itemPos);
chooseItemStyle(itemPos);
}
});
}
}
//
public void chooseItemStyle(int pos) {
clearItemsStyle();
if (pos < getChildCount()) {
X childView = (X) getChildAt(pos);
childView.setBackgroundResource(itemBGResPre);
childView.setTextColor(itemTextColorPre);
setItemPadding(childView);
}
}
private void setItemPadding(X view) {
if (view instanceof Button) {
view.setPadding(textModePadding, 0, textModePadding, 0);
} else {
view.setPadding(textModePadding, textModePadding, textModePadding, textModePadding);
}
}
// Group
private void clearItemsStyle() {
for (int i = 0; i < getChildCount(); i++) {
X childView = (X) getChildAt(i);
childView.setBackgroundResource(itemBGResNor);
childView.setTextColor(itemTextColorNor);
setItemPadding(childView);
}
}
public void addItemViews(ArrayList<String> texts, String mode) {
mTexts = texts;
removeAllViews();
for (String text : texts) {
addItemView(text, mode);
}
}
private void addItemView(String text, String mode) {
X childView = null;
switch (mode) {
case BTN_MODE:
childView = (X) new Button(mContext);
break;
case TEV_MODE:
childView = (X) new TextView(mContext);
break;
}
childView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT));
childView.setTextSize(itemTextSize);
childView.setBackgroundResource(itemBGResNor);
setItemPadding(childView);
childView.setTextColor(itemTextColorNor);
childView.setText(text);
this.addView(childView);
}
public String getChooseText(int itemID) {
if (itemID >= 0) {
return mTexts.get(itemID);
}
return null;
}
public void setItemTextSize(float itemTextSize) {
this.itemTextSize = itemTextSize;
}
public void setItemBGResNor(int itemBGResNor) {
this.itemBGResNor = itemBGResNor;
}
public void setItemTextColorNor(int itemTextColorNor) {
this.itemTextColorNor = itemTextColorNor;
}
public void setItemBGResPre(int itemBGResPre) {
this.itemBGResPre = itemBGResPre;
}
public void setItemTextColorPre(int itemTextColorPre) {
this.itemTextColorPre = itemTextColorPre;
}
public interface OnGroupItemClickListener {
void onGroupItemClick(int item);
}
}
버튼 그룹 을 설정 할 수 있 는 아 이 템 의 스타일 을 제공 합 니 다.그리고 이 GoodsViewGroup
은 왜 GoodsViewGroup<X extends TextView>
이 라 고 썼 습 니까?사실 여기 서 저 는 범 형 을 만 들 고 싶 습 니 다.Button
과 TextView
을 사용 할 수 있 습 니 다.여기 서 Button
본 생 은 TextView
을 계승 하 는 것 이기 때문에 코드 에서 판단 을 해 야 합 니 다.상기 방법 setItemPadding(X view)
을 볼 수 있 습 니 다.그럼 여기까지 오 면 어떤 친구 들 은 왜 두 개 를 만 들 었 냐 고 물 어 볼 수도 있 습 니 다.사실 이곳 은
TextView
이 자동 으로 padding
이 설치 되 지 않 기 때문에 button
은 자동 으로 padding
이 설치 되 어 있다.이 럴 때 는 네가 먼저 그런 효 과 를 원한 다 는 것 을 봐 야 한다!하지만 제 코드 를 통 해 TextView
을 선택 했다 면 여기 도 padding
을 설치 해서 그 에 게 주 었 습 니 다.그렇지 않 으 면 보기 싫 을 것 입 니 다!두 가지 패턴 의 쓰기:
1.Button :
GoodsViewGroup<Button> mGroup;
mGroup.addItemViews(viewtexts, GoodsViewGroup.BTN_MODE);
2.TextView
GoodsViewGroup<TextView> mGroup;
mGroup.addItemViews(viewtexts, GoodsViewGroup.TEV_MODE);
3.Drawable 파일:위 에 언급 된 단추 선택 과 정상 적 인 Drawable 두 개1.goods_item_btn_normal.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#F5F5F5" />
<corners android:radius="15.0dip" />
</shape>
</item>
</layer-list>
2.goods_item_btn_selected.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape>
<solid android:color="#FE4F00" />
<corners android:radius="15.0dip" />
</shape>
</item>
</layer-list>
4.예:ButtonGroupActivity
/**
* Created by ShaoLin on 2016/8/22.
*/
public class ButtonGroupActivity extends Activity implements GoodsViewGroup.OnGroupItemClickListener, View.OnClickListener {
private GoodsViewGroup<TextView> mGroup;
private Button mSubmitBtn;
private ArrayList<String> viewtexts = new ArrayList<>();
private int chooseID = -1;
private String chooseText;
@Override
protected void onCreate(Bundle savedInstanceState) {
setContentView(R.layout.activity_buttongroup);
mGroup = (GoodsViewGroup) findViewById(R.id.viewGroup);
mSubmitBtn = (Button) findViewById(R.id.submitBtn);
String text;
for (int i = 0; i < 10; i++) {
text = "L" + i;
viewtexts.add(text);
}
mGroup.addItemViews(viewtexts, GoodsViewGroup.TEV_MODE);
mGroup.setGroupClickListener(this);
mSubmitBtn.setOnClickListener(this);
super.onCreate(savedInstanceState);
}
@Override
public void onGroupItemClick(int item) {
chooseID = item;
chooseText = mGroup.getChooseText(item);
}
@Override
public void onClick(View view) {
if (chooseID >= 0) {
showToast("ID:" + chooseID + ";text:" + chooseText);
} else {
showToast(" ");
}
}
private void showToast(String text) {
Toast.makeText(ButtonGroupActivity.this, text, Toast.LENGTH_SHORT).show();
}
}
activity_buttongroup.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linear_ayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<com.example.jisuanqi.GoodsViewGroup
android:id="@+id/viewGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.example.jisuanqi.GoodsViewGroup>
<Button
android:id="@+id/submitBtn"
android:text=" "
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>
총결산이상 은 안 드 로 이 드 가 타 오 바 오 에서 선택 한 상품 의 서로 다른 사이즈 의 버튼 그룹 에 관 한 모든 내용 입 니 다.만약 에 본 고 에 문제 가 있 으 면 여러분 의 지적 을 환영 합 니 다.여러분 이 공동으로 발전 하 세 요!이 글 이 여러분 의 학습 과 업무 에 도움 이 되 었 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.