Android自定义控件简单实现ratingbar效果
<!--自定星级控件-->
<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>
本控件继承线性布局的starbar,代码过于简单,直接贴出来
package cn.ihealthcom.ihealth.widget; 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; import cn.ihealthcom.ihealth.R; /**
* 简单实现星级评选控件:内部填充多个ImageView
* 继承LinearLayout 设置水平方向
* Created by qiuchunjia on 2016/4/12.
*/
public class StarView extends LinearLayout {
private int mImageWidth = ; //图片设置默认的宽度
private int mImageHeight = ; //图片设置默认的高度
private int mDefaultImageId = R.drawable.ic_launcher;
private int mClickImageId = R.drawable.ic_launcher;
private int mMargin = ; //图片之间默认的margin
private int mStarNum = ; //星星默认的个数
private int mStarChoose = ; //默认默认是三颗星
private boolean isClick = true; private OnStarItemClickListener mStarItemClickListener; public StarView(Context context, AttributeSet attrs) {
super(context, attrs);
initData(context, attrs);
} public StarView(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, , );
int n = a.getIndexCount(); for (int i = ; i < n; i++) {
int attr = a.getIndex(i);
switch (attr) {
case R.styleable.StarView_mImageWidth:
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 <= ) {
try {
throw new Exception("设置的数据不能小于等于零");
} catch (Exception e) {
e.printStackTrace();
}
}
this.removeAllViews(); //清空所有view
for (int i = ; i < number; i++) {
ImageView imageView = new ImageView(getContext());
final LinearLayout.LayoutParams layoutParams = new LinearLayout.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+);
if (mStarItemClickListener != null) {
mStarItemClickListener.onItemClick(imageView, i);
}
}
});
}
} /**
* 设置当前选择
*
* @param index
*/
private void setCurrentChoose(int index) {
if(isClick){
for (int i = ; i < index; i++) {
ImageView imageView = (ImageView) getChildAt(i);
imageView.setImageResource(mClickImageId);
}
}
} /**
* 重置默认为默认的图片
*/
private void resetDefaultImage() {
int cNum = getChildCount();
for (int i = ; 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);
} }
代码中只实现了ratingbar常用的功能,能满足项目的需求.xml使用
<cn.ihealthcom.ihealth.widget.StarView
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="@mipmap/star_y"
fresco:mDefaultImageId="@mipmap/star_n"
fresco:mImageHeight="@dimen/margin_15dp"
fresco:mImageWidth="@dimen/margin_15dp"
fresco:mMargin="2dp"
fresco:mStarChoose=""
fresco:mStarNum="" />
Android自定义控件简单实现ratingbar效果的更多相关文章
- Android自定义控件练手——波浪效果
这一次要绘制出波浪效果,也是小白的我第一次还望轻喷.首先当然是展示效果图啦: 一.首先来说说实现思路. 想到波浪效果,当然我第一反应是用正余弦波来设计啦(也能通过贝塞尔曲线,这里我不提及这个方法但是在 ...
- android自定义控件(5)-实现ViewPager效果
对于系统的ViewGroup我们已经是十分熟悉了,最常用的LinearLayout和RelativeLayout几乎是天天要打交道,下面我们就来看看,如何一步一步将其实现: 一.首先当然也是最通常的新 ...
- Android自定义控件实战——水流波动效果的实现WaveView
转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38556891 水流波动的波形都是三角波,曲线是正余弦曲线,但是Android ...
- Android:简单的弹幕效果达到
首先,效果图.分类似至360检测到的骚扰电话页面: 布局非常easy,上面是一个RelativeLayout,以下一个Button. 功能: (1)弹幕生成后自己主动从右側往左側滚动(Translat ...
- android自定义控件(4)-自定义水波纹效果
一.实现单击出现水波纹单圈效果: 照例来说,还是一个自定义控件,观察这个效果,发现应该需要重写onTouchEvent和onDraw方法,通过在onTouchEvent中获取触摸的坐标,然后以这个坐标 ...
- Android 自定义控件实现刮刮卡效果 真的就只是刮刮卡么
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40162163 , 本文出自:[张鸿洋的博客] 很久以前也过一个html5的刮刮卡 ...
- Android自定义控件之自定义ViewGroup实现标签云
前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...
- Android自定义控件之自定义组合控件
前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...
- android自定义控件实现TextView按下后字体颜色改变
今天跟大家分享一下Android自定义控件入门,先介绍一个简单的效果TextView,按下改变字体颜色,后期慢慢扩展更强大的功能 直接看图片 第一张是按下后截的图,功能很简单, ...
随机推荐
- bytes、str与unicode
1.Python3字符序列的类型 bytes -> 原始的8位值(既字节) str -> Unicode字符 2.Python2字符序列的类型 str -> 原始的8位值(既字节) ...
- STM32是如何进入中断服务函数xxx_IRQHandler的
今天在看stm32的中断,一时间不理解stm32主函数是如何进入中断函数的,按C编程的理解,会有个特定的入口之类的,但是看demo过程中没有发现入口. 以串口中断服务函数void USART1_IRQ ...
- 2019年北航OO第三单元(JML规格任务)总结
一.JML简介 1.1 JML与契约式设计 说起JML,就不得不提到契约式设计(Design by Contract).这种设计模式的始祖是1986年的Eiffel语言.它是一种限定了软件中每个元素所 ...
- A题之变态青蛙跳
一仅仅青蛙一次能够跳上1级台阶,也能够跳上2级--它也能够跳上n级. 求该青蛙跳上一个n级的台阶总共同拥有多少种跳法. 分析: 这是一个斐波拉契数列的引申问题,先来看看斐波拉契数列: n<=1, ...
- 足球大数据:致足球怀疑论者-The Counter(s)-Reformation反教条改革
足球大数据:致足球怀疑论者-The Counter(s)-Reformation反教条改革 注:本序列文章都是本人对<The Numbers Game>书(豆瓣链接http://book. ...
- Google代码规范工具Cpplint的使用
Cpplint是一个python脚本,Google使用它作为自己的C++代码规范检查工具. 假设你所在的公司也使用Google C++代码规范,那么你有必要了解下Cpplint. 以下说一下Cppli ...
- How to Download Windows 10 Spotlight/Lock Screen Images
http://www.online-tech-tips.com/windows-10/download-windows-10-spotlight-lock-screen-images/ 图片位置 C: ...
- Windows下Python2.7配置OpenCV2.4.10
所需文件: 1 Python2.7.13 链接: https://www.python.org/downloads/release/python-2713/ 这里选Windows 64位的安装包. 2 ...
- [GDKOI2010] 圈地计划(网络流)
题2链接:https://www.luogu.org/problemnew/show/P1935 Description 最近房地产商GDOI(Group of Dumbbells Or Idiots ...
- java9新特性-16-Deprecated的相关API
1.官方Feature 211: Elide Deprecation Warnings on Import Statements 214: Remove GC Combinations Depreca ...