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> 이 라 고 썼 습 니까?사실 여기 서 저 는 범 형 을 만 들 고 싶 습 니 다.ButtonTextView 을 사용 할 수 있 습 니 다.여기 서 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>
총결산
이상 은 안 드 로 이 드 가 타 오 바 오 에서 선택 한 상품 의 서로 다른 사이즈 의 버튼 그룹 에 관 한 모든 내용 입 니 다.만약 에 본 고 에 문제 가 있 으 면 여러분 의 지적 을 환영 합 니 다.여러분 이 공동으로 발전 하 세 요!이 글 이 여러분 의 학습 과 업무 에 도움 이 되 었 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기