自定义RatingBar控件,实现可自定义星星(或项目所需图片)的宽高,告别使用warp_content导致控件大小不可控
2017-07-12 21:40
555 查看
之前做过的一款app中涉及到RatingBar控件,基本上来说都会要求用图片来替代, 即使同样是星星(可能是觉得系统自带的比较丑吧,不过我觉得还好啊)。 当时就觉得很难去做适配,UI给的图片没法去控制宽高,只能使用warp_content来做, 可是这样会导致控件很大,即使是用了maxHeight和minHeight来控制,这只是控制了RatingBar的宽高, 对于RatingBar里的子控件(姑且这么说吧,有知道的可以告诉我)是没有效果的。 当时想着自定义来解决,后来项目要求不是那么严格吧,就没有处理。如果还是那么做的话会超出屏幕范围, 没办法,只能自己搞定咯。 这是自定义控件
package com.lg.customstarview; import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; /** * 简单实现星级评选控件:内部填充多个ImageView * 继承LinearLayout 设置水平方向 */ public class CustomStarView extends LinearLayout { private int mImageWidth = 20; //图片设置默认的宽度 private int mImageHeight = 20; //图片设置默认的高度 private int mDefaultImageId = R.mipmap.ic_launcher; private int mClickImageId = R.mipmap.ic_launcher; private int mMargin = 5; //图片之间默认的margin private int mStarNum = 5; //星星默认的个数 private int mStarChoose = 3; //默认默认是三颗星 private boolean isClick = true; private OnStarItemClickListener mStarItemClickListener; public CustomStarView(Context context, AttributeSet attrs) { super(context, attrs); initData(context, attrs); } public CustomStarView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initData(context, attrs); } /** * 初始化数据 * * @param context * @param attrs */ private void initData(Context context, AttributeSet attrs) { this.setOrientation(HORIZONTAL); //设置水平 TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.StarView, 0, 0); int n = a.getIndexCount(); for (int i = 0; i < n; i++) { int attr = a.getIndex(i); switch (attr) { case R.styleable.StarView_mImageWidth: d4ef mImageWidth = (int) a.getDimension(attr, mImageWidth); break; case R.styleable.StarView_mImageHeight: mImageHeight = (int) a.getDimension(attr, mImageHeight); break; case R.styleable.StarView_mDefaultImageId: mDefaultImageId = a.getResourceId(attr, mDefaultImageId); break; case R.styleable.StarView_mClickImageId: mClickImageId = a.getResourceId(attr, mClickImageId); break; case R.styleable.StarView_mMargin: mMargin = (int) a.getDimension(attr, mMargin); break; case R.styleable.StarView_mStarNum: mStarNum = a.getInt(attr, mStarNum); break; case R.styleable.StarView_mStarChoose: mStarChoose = a.getInt(attr, mStarChoose); break; } } a.recycle(); } @Override protected void onFinishInflate() { super.onFinishInflate(); setStarNum(mStarNum); //设置个数 } /** * 设置星星数量 * 调用该方法可以手动设置星星数量 * @param number */ public void setStarNum(int number) { // if (number <= 0) { // try { // throw new Exception("设置的数据不能小于等于零"); // } catch (Exception e) { // e.printStackTrace(); // } // } this.removeAllViews(); //清空所有view if(number == 0){ for (int i = 0; i < 5; i++) { ImageView imageView = new ImageView(getContext()); final LayoutParams layoutParams = new LayoutParams(mImageWidth, mImageHeight); layoutParams.leftMargin = mMargin; layoutParams.rightMargin = mMargin; imageView.setLayoutParams(layoutParams); this.addView(imageView); imageView.setImageResource(mDefaultImageId); // setStarOnClick(imageView, i); } }else { for (int i = 0; i < number; i++) { ImageView imageView = new ImageView(getContext()); final LayoutParams layoutParams = new LayoutParams(mImageWidth, mImageHeight); layoutParams.leftMargin = mMargin; layoutParams.rightMargin = mMargin; imageView.setLayoutParams(layoutParams); this.addView(imageView); imageView.setImageResource(mDefaultImageId); // setStarOnClick(imageView, i); } setCurrentChoose(mStarChoose); //设置当前选择 } } /** * 设置点击事件 * * @param imageView * @param i */ private void setStarOnClick(final ImageView imageView, final int i) { if (imageView != null) { imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View view) { resetDefaultImage(); setCurrentChoose(i+1); if (mStarItemClickListener != null) { mStarItemClickListener.onItemClick(imageView, i); } } }); } } /** * 设置当前选择 * * @param index */ private void setCurrentChoose(int index) { if(isClick){ for (int i = 0; i < index; i++) { ImageView imageView = (ImageView) getChildAt(i); imageView.setImageResource(mClickImageId); } } } /** * 重置默认为默认的图片 */ private void resetDefaultImage() { int cNum = getChildCount(); for (int i = 0; i < cNum; i++) { ImageView imageView = (ImageView) getChildAt(i); imageView.setImageResource(mDefaultImageId); } } public int getImageWidth() { return mImageWidth; } public void setImageWidth(int mImageWidht) { this.mImageWidth = mImageWidht; } public int getImageHeight() { return mImageHeight; } public void setImageHeight(int mImageHeight) { this.mImageHeight = mImageHeight; } public int getDefaultImageId() { return mDefaultImageId; } public void setDefaultImageId(int resouceId) { this.mDefaultImageId = mDefaultImageId; } public int getClickImageId() { return mClickImageId; } public void setClickImageId(int mClickImageId) { this.mClickImageId = mClickImageId; } public OnStarItemClickListener getStarItemClickListener() { return mStarItemClickListener; } public void setmStarItemClickListener(OnStarItemClickListener mStarItemClickListener) { this.mStarItemClickListener = mStarItemClickListener; } /** * 星星点击事件 */ public interface OnStarItemClickListener { public void onItemClick(View view, int pos); } }`
自定义空间设计到的style,放在styles目录下即可
<!--自定星级控件--> <declare-styleable name="StarView"> <attr name="mImageWidth" format="dimension"/> <attr name="mImageHeight" format="dimension" /> <attr name="mDefaultImageId" format="reference" /> <attr name="mClickImageId" format="reference" /> <attr name="mMargin" format="dimension" /> <attr name="mStarNum" format="integer" /> <attr name="mStarChoose" format="integer" /> </declare-styleable> 布局文件在这里 <com.lg.customstarview.CustomStarView android:layout_alignParentRight="true" android:layout_marginLeft="5dp" android:layout_marginRight="10dp" android:id="@+id/start_view" android:layout_width="wrap_content" android:layout_height="wrap_content" fresco:mClickImageId="@drawable/medal_selected" fresco:mDefaultImageId="@drawable/medal" fresco:mImageHeight="20dp" fresco:mImageWidth="20dp" fresco:mMargin="2dp" fresco:mStarChoose="3" fresco:mStarNum="5" />
好了,大概就是这样了,简单的源码链接 http://download.csdn.net/download/alwaysgoalong/9896943
相关文章推荐
- Android自定义View之自定义评价打分控件RatingBar实现自定义星星大小和间距
- Android自定义View之自定义评价打分控件RatingBar实现自定义星星大小和间距
- [置顶] viewPager+photoView实现图片轮播和手势缩放功能 支持手势缩放的imageView 如何实现相册左右滑动和手势缩放 如何让图片自适应控件大小 photoView如何使用(上)
- Android学习笔记之RatingBar1>简介 RatingBar为评分条控件,默认效果为若干个绿色的星星,如果想将其换成其他自定义图片就要自定义它的style。 RatingBar是SeekBa
- Android自定义星星评分控件代替RatingBar的使用
- 【Android自定义View实战】之自定义评价打分控件RatingBar,可以自定义星星大小和间距
- 【Android自定义View实战】之自定义评价打分控件RatingBar,可以自定义星星大小和间距
- 自定义评价打分控件RatingBar,可以自定义星星大小和间距
- 【Android自定义View实战】之自定义评价打分控件RatingBar,可以自定义星星大小和间距
- JS限制上传图片大小不使用控件在本地实现
- 【Android自定义View实战】之自定义评价打分控件RatingBar,可以自定义星星大小和间距
- JS限制上传图片大小不使用控件在本地实现
- Android中自定义RatingBar实现星星大小,数量,间距等的设置
- Android中自定义RatingBar实现星星大小,数量,间距等的设置
- Android使用NinePatch图片实现大小可变的Button
- c#+Winform实现自定义的“复制、粘贴”右键快捷菜单,多个控件共享使用一个右键菜单。
- Android提高篇之自定义dialog实现processDialog“正在加载”效果、使用Animation实现图片旋转
- 基于地图开发控件GMap.Net 使用 (五) 原创 用户自定义标签图片
- android自定义View实现裁剪图片功能,不使用系统的
- 告别图片—使用字符实现兼容性的圆角尖角效果beta版