Android开发之瀑布流控件的实现与使用方法示例

Android开发之瀑布流控件的实现与使用方法示例,第1张

概述本文实例讲述了Android开发瀑布流控件的实现与使用方法。分享给大家供大家参考,具体如下:

本文实例讲述了AndroID开发之瀑布流控件的实现与使用方法。分享给大家供大家参考,具体如下:

public class FlowLayout extends VIEwGroup {  /**行里子vIEw之间的行距离*/  public int mHorizontolSpace = Util.getDimen(R.dimen.top_padding);  /**行里子vIEw之间的垂直距离*/  public int mVerticalSpace = Util.getDimen(R.dimen.top_padding);  /**创建行的集合*/  private List<line> mlines = new ArrayList<line>();  /**当前行*/  private line mCurrentline;  /**当前行使用的宽度*/  private int mCurrentUseWIDth = 0;  /**父容器的宽高*/  private int parentWIDthSize;  private int parentHeightSize;  public FlowLayout(Context context,AttributeSet attrs,int defStyleAttr) {    super(context,attrs,defStyleAttr);  }  public FlowLayout(Context context,AttributeSet attrs) {    super(context,attrs);  }  public FlowLayout(Context context) {    super(context);  }  @OverrIDe  protected voID onMeasure(int wIDthMeasureSpec,int heightmeasureSpec) {    //0.先清空行集合里的数据    clear();    //1.得到父vIEwGroup的模式与大小    int parentWIDthMode = MeasureSpec.getMode(wIDthMeasureSpec);//    parentWIDthSize = MeasureSpec.getSize(wIDthMeasureSpec) - getpaddingleft() - getpaddingRight();    int parentHeightmode = MeasureSpec.getMode(heightmeasureSpec);    parentHeightSize = MeasureSpec.getSize(heightmeasureSpec) - getpaddingBottom() - getpaddingtop();    /* 每个子vIEw都是包裹内容     * layout.addVIEw(mTextVIEw,new linearLayout.LayoutParams(LayoutParams.WRAP_CONTENT     * 得到每个孩子的测量规则     */    //2.得到每个孩子的模式    int chilDWIDthMode = parentWIDthMode == MeasureSpec.EXACTLY ? MeasureSpec.EXACTLY : parentWIDthMode;    int childHeightmode = parentHeightmode == MeasureSpec.EXACTLY ? MeasureSpec.EXACTLY : parentHeightmode;    //3.根据模式得到子控件的大小    int chilDWIDthMeasureSpec = MeasureSpec.makeMeasureSpec(chilDWIDthMode,parentWIDthSize);    int childHeightmeasureSpec = MeasureSpec.makeMeasureSpec(childHeightmode,parentHeightSize);    //得到子vIEw的个数    int count = getChildCount();    //创建新的行    mCurrentline = new line();    for (int i = 0; i < count; i++) {      VIEw childVIEw = getChildAt(i);      //4.测量每个孩子      childVIEw.measure(chilDWIDthMeasureSpec,childHeightmeasureSpec);      //5.得到测量后的孩子的宽高      int childMeasureWIDth = MeasureSpec.getSize(chilDWIDthMeasureSpec);      //int childMeasureHeight = MeasureSpec.getSize(childHeightmeasureSpec);      //6.得到此行使用的宽度      mCurrentUseWIDth += childMeasureWIDth;      //7.判断此行的宽度是否大于父控件的宽度,如果大于则换行      if (mCurrentUseWIDth > parentWIDthSize) {        //8.如果当前的子vIEw的宽度大于父容器的宽度,强行把这个vIEw添加的集合里        if (mCurrentline.getChildCount()<1) {          mlines.add(mCurrentline);         }        //9.换行        newline();      }else {        //8.把当前子vIEw添加到行里        mCurrentline.addChild(childVIEw);        //9.添加间隔        mCurrentUseWIDth += mHorizontolSpace;        if (mCurrentUseWIDth > parentWIDthSize) {          //10.换行          newline();        }      }    }    //11.如果集合里没有添加当前行,则把当前添加到集合    if (!mlines.contains(mCurrentline)) {      mlines.add(mCurrentline);    }    //12.设置富容器的总宽高    int parentWIDth = parentWIDthSize + getpaddingleft() + getpaddingRight();    int parentHeight = (mlines.size()-1) * mVerticalSpace + getpaddingBottom() + getpaddingtop();    for(line line : mlines){      //得到所以line的高度      parentHeight += line.getHeight();    }    //13.resolveSize表示哪个高度合适,就用哪个    setMeasuredDimension(parentWIDth,resolveSize(parentHeightSize,parentHeight));    /*setMeasuredDimension(getDefaultSize(getSuggestedMinimumWIDth(),wIDthMeasureSpec),getDefaultSize(getSuggestedMinimumHeight(),heightmeasureSpec));*/  }  /**   * 换行   */  private voID newline() {    //a.先把当前的行添加到集合    mlines.add(mCurrentline);    //b.创建新的一行    mCurrentline = new line();    //c.新行里的使用的行必须设置为0    mCurrentUseWIDth = 0;  }  public voID clear() {    mlines.clear();    mCurrentline = null;    mCurrentUseWIDth = 0;  }  @OverrIDe  protected voID onLayout(boolean changed,int l,int t,int r,int b) {    //15.得到每个line孩子的左上角的坐标    int left = l + getpaddingleft();    int top = t + getpaddingtop();    //现在容器里只有line是子孩子    for (int i = 0; i < mlines.size(); i++) {      line line = mlines.get(i);      //16.把分配位置给line去处理      line.layout(left,top);      //17.设置第一行后的其它行的top数值      top += line.getHeight() + mVerticalSpace;    }  }  /**   * 行类,用来封装一行的vIEw   */  private class line{    /**当前行的宽度*/    private int mWIDth = 0;    /**当前行的高度*/    private int mHeight = 0;    /**每个孩子得到的剩余空间*/    int mChildPdding = 0;    private List<VIEw> children = new ArrayList<VIEw>();    public voID addChild(VIEw childVIEw) {      children.add(childVIEw);      //取得之vIEw里最高的高度      if (childVIEw.getMeasuredHeight() > mHeight) {        mHeight = childVIEw.getMeasuredHeight();      }      //18.得到行宽度      mWIDth += childVIEw.getMeasureDWIDth();    }    /**     * 定位每个line在富容器里的额位置     * @param left     * @param top     */    public voID layout(int left,int top) {      //18.得到行宽度      mWIDth += mHorizontolSpace * (children.size() -1);      //19.得到剩余的宽度大小      //int padding = getMeasureDWIDth() - mWIDth;      int padding = parentWIDthSize - mWIDth;      if (padding > 0) {        mChildPdding = padding / children.size();      }      // getWIDth()vIEw显示的时候大小,如果vIEw没显示,这个值就为0,步包括隐藏的部分,getMeasureDWIDth()控件实际大小,包括隐藏的部分      //一般来说 getMeasureDWIDth() > getWIDth();      for (int i = 0; i < children.size(); i++) {        VIEw child = children.get(i);        //第一种:有间隔的flow        int bottom = child.getMeasuredHeight() + top;        //20.把剩余的空间分配给每个vIEw        int right = child.getMeasureDWIDth() + left + mChildPdding;        //第二种:无间隔的flow//       int bottom = getMeasuredHeight() + top;//       int right = getMeasureDWIDth() + left;        //第一个child的位置        child.layout(left,top,right,bottom);        //第二个及后面child的right        right += child.getMeasureDWIDth() + mHorizontolSpace + mChildPdding;      }    }    /**     * 得到子vIEw的大小     * @return     */    public int getChildCount() {      if (children != null) {        return children.size();      }      return 0;    }    public int getHeight() {      return mHeight;    }  }}

使用方法:

public class topFragment extends Fragment{  @OverrIDe  public VIEw onCreateVIEw(LayoutInflater inflater,VIEwGroup container,Bundle savedInstanceState) {    ScrollVIEw scrollVIEw = new ScrollVIEw(getActivity());    FlowLayout layout = new FlowLayout(getActivity());    layout.setBackgroundDrawable(Util.getDrawable(R.drawable.List_item_bg));    int padding = Util.getDimen(R.dimen.top_padding);    layout.setpadding(padding,padding,padding);    GradIEntDrawable pressDrawable = Drawableutil.createDrawable(0xffcecece);    for (int i = 0; i < mDatas.size(); i++) {      mTextVIEw = new TextVIEw(getActivity());      mTextVIEw.setText(mDatas.get(i));      GradIEntDrawable randomDrawable = Drawableutil.createrandomDrawable();      StateListDrawable stateListDrawable = Drawableutil.createStateDrawable(pressDrawable,randomDrawable);      mTextVIEw.setBackgroundDrawable(stateListDrawable);      mTextVIEw.setText@R_419_6004@(@[email protected]);      int left = Util.px2dip(7);      int top = Util.px2dip(4);      int right = Util.px2dip(7);      int bottom = Util.px2dip(4);      mTextVIEw.setpadding(left,bottom);      mTextVIEw.setTag(mDatas.get(i));      mTextVIEw.setonClickListener(this);      layout.addVIEw(mTextVIEw,new linearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,- 2));    }    scrollVIEw.addVIEw(layout);    }    return scrollVIEw;}

工具类:

public class Drawableutil {  /**   * 创建随机背景的drawable   * @return   */  public static GradIEntDrawable createrandomDrawable(){    GradIEntDrawable drawable = new GradIEntDrawable();    drawable.setCornerRadius(Util.px2dip(5));    Random random = new Random();    int red = random.nextInt(200) + 20;    int green = random.nextInt(200) + 20;    int blue = random.nextInt(200) + 20;    int @R_419_6004@ = @[email protected](red,green,blue);    drawable.set@R_419_6004@(@R_419_6004@);    return drawable;  }    /**     * 创建带有背景的drawable     * @return     */    public static GradIEntDrawable createDrawable(int @R_419_6004@){      GradIEntDrawable drawable = new GradIEntDrawable();      drawable.setCornerRadius(Util.px2dip(5));      drawable.set@R_419_6004@(@R_419_6004@);      return drawable;  }  /**   * 状态选择器   * @param press   * @param normal   * @return   */  public static StateListDrawable createStateDrawable(Drawable press,Drawable normal){    StateListDrawable drawable = new StateListDrawable();    //按下    drawable.addState(new int[]{androID.R.attr.state_pressed},press);    //正常    drawable.addState(new int[]{},normal);    return drawable;  }}

更多关于AndroID相关内容感兴趣的读者可查看本站专题:《Android窗口相关 *** 作技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家AndroID程序设计有所帮助。

总结

以上是内存溢出为你收集整理的Android开发之瀑布流控件的实现与使用方法示例全部内容,希望文章能够帮你解决Android开发之瀑布流控件的实现与使用方法示例所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1144015.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存