分类标签,一行展示,如果超过一行要可以左右滑动,不超过一行要平分布局居中展示。
初步使用 tablayout 来实现,自定义布局继承容器,添加layout布局是tablayout。根据数量大概判断设置tablayout模式。
点击每个item 下拉弹框展示一堆数据。感觉这样不太好,于是想着看能不能自己写一套出来。
初步想法,定义一个LinearLayout布局,每添加一个item进行长度计算,看是否超过一屏,超过一屏改换HorizontalScrollView。
每个item长度包括textview本身大小和margin左右距离。获取屏幕宽度。
我记得之前写搜索历史标签的时候计算过类似的,拿来用用,翻翻之前博客去!完了之前竟然没记录亏大了。
经过几个小时的研究终于完成了。
效果图
好了,终于成功了,点击弹框后面再想想加吧,这个支持超过一行滑动,自动的哦,不到一行默认均分!
上代码
package com.wavewave.popuwindow; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import androidx.annotation.Nullable; import java.util.List; /** * @author wavewave * @CreateDate: 2020/10/22 3:23 PM * @Description: 类似TabLayout 没有下划线,视图自动适配居中,当超过一屏自动左右滑动 * 可以自己设置默认间距 * @Version: 1.0 */ public class TitleFilterView extends HorizontalScrollView { private TitleLinearLayout mTitleLinearLayout; /** * 默认标签间距,当不超过屏幕会平均分 */ private int textViewMarginLeft = 10; /** * 默认高度 */ private int itemHeight = 88; public TitleFilterView(Context context) { this(context, null); } public TitleFilterView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, R.attr.tabStyle); } public TitleFilterView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TitleFilterView); textViewMarginLeft = typedArray.getInt(R.styleable.TitleFilterView_itemMargin, textViewMarginLeft); itemHeight = typedArray.getInt(R.styleable.TitleFilterView_titleHeight, itemHeight); } private void init() { mTitleLinearLayout = new TitleLinearLayout(getContext()); mTitleLinearLayout.setOrientation(LinearLayout.HORIZONTAL); super.addView(mTitleLinearLayout, 0, new HorizontalScrollView.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT)); } @SuppressLint("NewApi") public void setData(List<String> list) { if (list == null || list.size() == 0) { return; } mTitleLinearLayout.removeAllViews(); for (int i = 0; i < list.size(); i++) { LinearLayout linearLayout = new LinearLayout(getContext()); linearLayout.setLayoutParams(new ViewGroup.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT)); int[] attrs = new int[]{android.R.attr.selectableItemBackground}; TypedArray ta = getContext().obtainStyledAttributes(attrs); Drawable mDefaultFocusHighlightCache = ta.getDrawable(0); ta.recycle(); linearLayout.setForeground(mDefaultFocusHighlightCache); linearLayout.setGravity(Gravity.CENTER); ImageView imageView = new ImageView(getContext()); imageView.setImageResource(R.mipmap.icon_up_down); imageView.setPadding(5, 0, 0, 0); final TextView mTextView = new TextView(getContext()); // mTextView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.MATCH_PARENT)); mTextView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, itemHeight)); mTextView.setTextColor(Color.BLACK); mTextView.setGravity(Gravity.CENTER); mTextView.setText(list.get(i)); linearLayout.setPadding(textViewMarginLeft, 0, textViewMarginLeft, 0); linearLayout.addView(mTextView); linearLayout.addView(imageView); linearLayout.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); mTitleLinearLayout.addView(linearLayout); } } public class TitleLinearLayout extends LinearLayout { private int maxWidth; private int currentWidth = 0; private boolean isLine = true; public TitleLinearLayout(Context context) { super(context); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int childCount = getChildCount(); maxWidth = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight(); if (childCount > 0) { currentWidth = 0; for (int i = 0; i < childCount; i++) { Log.d("aaaaaa", "currentWidth::" + currentWidth); View childAt = getChildAt(i); measureChild(childAt, widthMeasureSpec, heightMeasureSpec); if (maxWidth <= currentWidth + childAt.getMeasuredWidth()) { isLine = false; break; } else { isLine = true; currentWidth += childAt.getMeasuredWidth(); } } Log.d("aaaaaa", "isLine::" + isLine); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); if (isLine) {//一行可以展示完毕 int childCount = getChildCount(); int addChildWidth = (maxWidth - currentWidth) / childCount; for (int i = 0; i < getChildCount(); i++) { View childAt = getChildAt(i); int paddingLeft = textViewMarginLeft + addChildWidth / 2; int paddingTop = childAt.getPaddingTop(); int paddingRight = textViewMarginLeft + addChildWidth / 2; int paddingBottom = childAt.getPaddingBottom(); Log.d("aaaaa", "paddingLeft:" + paddingLeft + " paddingTop:" + paddingTop + " paddingRight:" + paddingRight + " paddingBottom:" + paddingBottom); childAt.setPadding(paddingLeft, paddingTop, paddingRight, paddingBottom); } Log.d("aaaaaa", "onLayout isLine::" + isLine); } else { } } } }自定义了两个属性 可以不要
<declare-styleable name="TitleFilterView"> <attr name="titleHeight" format="integer" /> <attr name="itemMargin" format="integer" /> </declare-styleable>搞定!
