android 自定义view 历史记录

xiaoxiao2021-02-28  50

===================activity=============

public class MainActivity extends AppCompatActivity {    private String mNames[] = {            "好好学习","天天向上","我要疯了",            "学不会啊,怎么办呢","感觉天书一样","神啊,救救我吧!!!!!",            "八维不倒,末班到老","安卓就是一个坑","跳下来就是一望无际的黑暗",            "老司机开车,请系好安全套","你一万多的假包真好看","腾讯视频",            "错误的方式","天道酬勤,恒者能胜","抖音专辑","不想干了 , 我要休息!!!!!!"    };    private XCflowLayout mFlowLayout;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initChildViews();    }    private void initChildViews(){        mFlowLayout = (XCflowLayout) findViewById(R.id.flowlayout);        ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);        lp.leftMargin = 5;        lp.rightMargin = 5;        lp.topMargin = 5;        lp.bottomMargin = 5;        for(int i = 0; i < mNames.length; i ++){            TextView view = new TextView(this);            view.setText(mNames[i]);            view.setTextColor(Color.BLACK);            view.setBackgroundColor(Color.GRAY);            mFlowLayout.addView(view,lp);        }    }

}

=======================XCflowLayout====================

public class XCflowLayout extends ViewGroup {    //储存所有子View    List<List<View>> mAllChildViews = new ArrayList<>();    //每行的高度    List<Integer> mLineHeight=new ArrayList<>();    public XCflowLayout(Context context) {        this(context,null);    }    public XCflowLayout(Context context, AttributeSet attrs) {        this(context, attrs,0);    }    public XCflowLayout(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        //测量宽度        int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);        int modeWidth = MeasureSpec.getMode(widthMeasureSpec);        //测量高度        int sizeheight = MeasureSpec.getSize(heightMeasureSpec);        int modeheight = MeasureSpec.getMode(heightMeasureSpec);        //如果宽高为wrap_content的情况        int width=0;        int height=0;        //记录每一行的宽高        int lineWidth=0;        int lineHeight=0;        //获取一个view的个数        int childCount = getChildCount();        //循环获得每个view的数值        for(int i=0;i<childCount;i++){            View child = getChildAt(i);            //测量子View的宽高            measureChild(child,widthMeasureSpec,heightMeasureSpec);            //得到LayoutParams            MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams();            //子View 占据的宽度            int childWidth = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;            //子View占据的高            int childHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin;            //换行的时候            if(lineWidth+childWidth>sizeWidth){                //对比得到最大的宽度                width=Math.max(width,lineWidth);                //重置lineWidth                lineWidth=childWidth;                //记录行高                height+= lineHeight;                lineHeight=childHeight;            }else{                //叠加行宽                lineWidth+=childWidth;                //得到最大行高                lineHeight=Math.max(lineHeight,childHeight);            }            //处理最后一个子View            if(i==childCount-1){                width=Math.max(width,lineWidth);                height+=lineHeight;            }        }        //wrap_content        setMeasuredDimension(modeWidth==MeasureSpec.EXACTLY ? sizeWidth:width,modeheight==MeasureSpec.EXACTLY ? sizeheight:height);        super.onMeasure(widthMeasureSpec, heightMeasureSpec);    }    @Override    protected void onLayout(boolean changed, int l, int t, int r, int b) {        mAllChildViews.clear();        mLineHeight.clear();        //获得当前ViewGroup的宽度        int width = getWidth();        int lineWidth=0;        int lineHeight=0;        // 记录当前行的View        List<View> lineViews=new ArrayList<View>();        int childCount = getChildCount();        for(int i=0;i<childCount;i++){            View child = getChildAt(i);            MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();            int childWidth = child.getMeasuredWidth();            int childHeight = child.getMeasuredHeight();            //如果需要换行            if(childWidth+lineWidth+lp.leftMargin+lp.rightMargin>width){                //记录LineHeight                mLineHeight.add(lineHeight);                //记录当前的Views                mAllChildViews.add(lineViews);                //重置行高                lineWidth=0;                lineHeight=childHeight+lp.topMargin+lp.bottomMargin;                //重置view的集合                lineViews=new ArrayList();            }            lineWidth += childWidth + lp.leftMargin + lp.rightMargin;            lineHeight = Math.max(lineHeight, childHeight + lp.topMargin + lp.bottomMargin);            lineViews.add(child);        }        //处理最后一行        mLineHeight.add(lineHeight);        mAllChildViews.add(lineViews);        //设置子View的位置        int left = 0;        int top = 0;        //获取行数        int lineCount = mAllChildViews.size();        for(int i =0;i<lineCount;i++){            //当前行的Views和高度            lineViews=mAllChildViews.get(i);            lineHeight=mLineHeight.get(i);            for (int j=0;j<lineViews.size();j++){                View child=lineViews.get(j);                //判断是否显示                if(child.getVisibility()==View.GONE){                    continue;                }                MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams();                int cLeft = left + lp.leftMargin;                int cTop = top + lp.topMargin;                int cRight = cLeft + child.getMeasuredWidth();                int cBottom = cTop + child.getMeasuredHeight();                //进行子View进行布局                child.layout(cLeft, cTop, cRight, cBottom);                left += child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin;            }            left = 0;            top += lineHeight;        }    }    /**     * 与当前ViewGroup对应的LayoutParams     */    @Override    public LayoutParams generateLayoutParams(AttributeSet attrs) {        // TODO Auto-generated method stub        return new MarginLayoutParams(getContext(), attrs);    }}

转载请注明原文地址: https://www.6miu.com/read-2630943.html

最新回复(0)