自己定义RatingBar,能依据设置改变样式
项目在我的GITHUB上 mirsfang的GitHub
一个简单的自己定义View ,为了一个 比較奇葩的需求而搞出来的。他的功能就是能让你自己设置图片和图片的大小以及星星的数量,是一个组合型的自己定义View,继承自
LinearLayout,他的属性有<declare-styleable name="RatingBar" tools:ignore="ResourceName">
<!--尺寸值-->
<attr name="starImageSize" format="dimension"/>
<attr name="starCount" format="integer"/>
<!--资源文件值-->
<attr name="starEmpty" format="reference"/>
<!--资源文件值-->
<attr name="starFill" format="reference"/>
<!--资源文件值-->
<attr name="starHalf" format="reference"/>
<!--boolean值-->
<attr name="clickable" format="boolean"/>
<!--改变样式的值-->
<attr name="changeTo" format="integer"></attr>
</declare-styleable>实现的代码
package com.example.mirsfang.ratingbardemo; import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout; import java.math.BigDecimal; /**
* Created by Mirs on 2016/4/11.
*
* add halfstar show
*
* Correction clickEvent from Xml
*/
public class RatingBar extends LinearLayout {
private boolean mClickable;
private int starCount;
private OnRatingChangeListener onRatingChangeListener;
private float starImageSize;
private Drawable starEmptyDrawable;
private Drawable starFillDrawable;
private Drawable starHalfDrawable;
//须要改变的地方
private Changed changed;
//须要改变的地方
private float a=0; /**
* 设置半颗星星的图片
* */
public void setStarHalfDrawable(Drawable starHalfDrawable) {
this.starHalfDrawable = starHalfDrawable;
} /**
* 当星星被点击时候的回调
* */
public void setOnRatingChangeListener(OnRatingChangeListener onRatingChangeListener) {
this.onRatingChangeListener = onRatingChangeListener;
} /**
* 能否被点击
* */
public void setmClickable(boolean clickable) {
this.mClickable = clickable;
} /**
* 设置星星的图片
* */
public void setStarFillDrawable(Drawable starFillDrawable) {
this.starFillDrawable = starFillDrawable;
}
/***
*
* 设置星星的背景
*/
public void setStarEmptyDrawable(Drawable starEmptyDrawable) {
this.starEmptyDrawable = starEmptyDrawable;
} /***
* 设置星星的大小
*
/
public void setStarImageSize(float starImageSize) {
this.starImageSize = starImageSize;
} /**
* @param context
* @param attrs
*/
public RatingBar(Context context, AttributeSet attrs) {
super(context, attrs);
setOrientation(LinearLayout.HORIZONTAL);
TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.RatingBar);
starImageSize = mTypedArray.getDimension(R.styleable.RatingBar_starImageSize, 20);
starCount = mTypedArray.getInteger(R.styleable.RatingBar_starCount, 5);
starEmptyDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starEmpty);
starFillDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starFill);
starHalfDrawable=mTypedArray.getDrawable(R.styleable.RatingBar_starHalf);
mClickable=mTypedArray.getBoolean(R.styleable.RatingBar_clickable,true);
for (int i = 0; i < starCount; ++i) {
ImageView imageView = getStarImageView(context, attrs);
imageView.setOnClickListener(
new OnClickListener() {
@Override
public void onClick(View v) {
if (mClickable) {
a+=0.5f;
setStar(indexOfChild(v) + a);
if (onRatingChangeListener != null) {
onRatingChangeListener.onRatingChange(indexOfChild(v) + a);
}
if(a==1){
a=0;
}
} }
}
);
addView(imageView);
}
} /**
* @param context
* @param attrs
* @return
*/
private ImageView getStarImageView(Context context, AttributeSet attrs) {
ImageView imageView = new ImageView(context);
ViewGroup.LayoutParams para = new ViewGroup.LayoutParams(
Math.round(starImageSize),
Math.round(starImageSize)
);
imageView.setLayoutParams(para);
imageView.setPadding(0, 0, 5, 0);
imageView.setImageDrawable(starEmptyDrawable);
imageView.setMaxWidth(10);
imageView.setMaxHeight(10);
return imageView; } /**
* 设置要改变的数据
* */
public void setChanged(Changed changed){
this.changed=changed;
} public Changed getChanged(){
return new Changed();
}
/**
* setting start
*
* @param starCount
*/ public void setStar(float starCount) { //浮点数的整数部分
int fint = (int) starCount;
BigDecimal b1 = new BigDecimal(Float.toString(starCount));
BigDecimal b2 = new BigDecimal(Integer.toString(fint));
//浮点数的小数部分
float fPoint = b1.subtract(b2).floatValue(); starCount = fint > this.starCount ? this.starCount : fint;
starCount = starCount < 0 ? 0 : starCount; //drawfullstar
if(changed!=null&&changed.getPosintion()>=0){
if(b1.floatValue()<=changed.getPosintion()&&changed.changeDrawable!=null){
for (int i = 0; i < starCount; ++i) {
((ImageView) getChildAt(i)).setImageDrawable(changed.changeDrawable);
}
}else{
for (int i = 0; i < starCount; ++i) {
((ImageView) getChildAt(i)).setImageDrawable(starFillDrawable);
}
}
}else{
for (int i = 0; i < starCount; ++i) {
((ImageView) getChildAt(i)).setImageDrawable(starFillDrawable);
}
} //drawhalfstar
if (fPoint > 0) {
if(changed!=null&&changed.getPosintion()>=0){
if(b1.floatValue()<=changed.getPosintion()&&changed.changeDrawable!=null) {
((ImageView) getChildAt(fint)).setImageDrawable(changed.changeHarlfDrawable);
}else {
((ImageView) getChildAt(fint)).setImageDrawable(starHalfDrawable);
}
}else {
((ImageView) getChildAt(fint)).setImageDrawable(starHalfDrawable);
} //drawemptystar
for (int i = this.starCount - 1; i >= starCount + 1; --i) {
((ImageView) getChildAt(i)).setImageDrawable(starEmptyDrawable);
} } else {
//drawemptystar
for (int i = this.starCount - 1; i >= starCount; --i) {
((ImageView) getChildAt(i)).setImageDrawable(starEmptyDrawable);
} } } /**
* change stat listener
*/
public interface OnRatingChangeListener { void onRatingChange(float RatingCount); } /**
* 须要改变的图片的坐标和图片
* */ public class Changed{
private int posintion=-1;
private Drawable changeDrawable;
private Drawable changeHarlfDrawable; public int getPosintion() {
return posintion;
} public void setPosintion(int posintion) {
this.posintion = posintion;
} public Drawable getChangeDrawable() {
return changeDrawable;
} public void setChangeDrawable(Drawable changeDrawable) {
this.changeDrawable = changeDrawable;
} public Drawable getChangeHarlfDrawable() {
return changeHarlfDrawable;
} public void setChangeHarlfDrawable(Drawable changeHarlfDrawable) {
this.changeHarlfDrawable = changeHarlfDrawable;
}
} }在布局中引用的时候在最外层布局引入
xmlns:mirsfang="http://schemas.android.com/apk/res-auto"然后
<com.example.mirsfang.ratingbardemo.RatingBar
android:layout_marginTop="50dp"
android:layout_gravity="center"
android:id="@+id/ratingbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
mirsfang:clickable="true"
mirsfang:starEmpty="@drawable/grabhb_ash"
mirsfang:starFill="@drawable/grabhb_red"
mirsfang:starHalf="@drawable/grabhb_halfred"
mirsfang:starImageSize="30dp"
></com.example.mirsfang.ratingbardemo.RatingBar>在MainActivity中
RatingBar mRatingBar = (RatingBar) findViewById(R.id.ratingbar); //点击之后的回调
mRatingBar.setOnRatingChangeListener(
new RatingBar.OnRatingChangeListener() {
@Override
public void onRatingChange(float RatingCount) {
Log.e(TAG,RatingCount+"");
}
}
); //优先设置一定数量下的星星样式
RatingBar.Changed changed=mRatingBar.getChanged();
changed.setPosintion(2);
changed.setChangeDrawable(getResources().getDrawable(R.drawable.grabhb_yellow));
changed.setChangeHarlfDrawable(getResources().getDrawable(R.drawable.grabhb_yellowhalf));
mRatingBar.setChanged(changed);
//设置星星
mRatingBar.setStar(a.floatValue()); //设置正常下的星星的样式
mRatingBar.setmClickable(true);
mRatingBar.setStarImageSize(16f);
mRatingBar.setStarEmptyDrawable(getResources().getDrawable(R.drawable.grabhb_ash));
mRatingBar.setStarFillDrawable(getResources().getDrawable(R.drawable.grabhb_red));
mRatingBar.setStarHalfDrawable(getResources().getDrawable(R.drawable.grabhb_halfred));注意要先设置一定数量下的星星样式,
自己定义RatingBar,能依据设置改变样式的更多相关文章
- css003 选择器:明确设置哪些样式
css003 选择器:明确设置哪些样式 1.每个样式的两个部分:选择器和声明块 1.标签选择器:整体控制 2.类选择器:精确控制(.+字母.数字.连字符或下划线) Css允许的类名为.+字母.数字.连 ...
- JS设置CSS样式的几种方式
用JS来动态设置CSS样式,常见的有以下几种 1. 直接设置style的属性 某些情况用这个设置 !important值无效 如果属性有'-'号,就写成驼峰的形式(如textAlign) 如果想保 ...
- JS设置CSS样式的几种方式【转】
用JS来动态设置CSS样式,常见的有以下几种 1. 直接设置style的属性 某些情况用这个设置 !important值无效 如果属性有'-'号,就写成驼峰的形式(如textAlign) 如果想保 ...
- ReactJs设置css样式
前段时间看了React Native,但是感觉在安卓反面的开发并不成熟.有较多功能有待完善,而且自己在实际运用的过程中在一些模块上遇到了不晓得阻力,又苦于网上没有找到那么多资源.于是打算先放一段时间, ...
- web appbuilder 改变样式和添加自定义widget
一.改变样式 要实现的效果是添加cyan样式 1.将FoldableTheme/style下的cyan copy到TabTheme下的同一目录下: 2.打开TabTheme下的manifest,cop ...
- cssText设置css样式
js中用cssText设置css样式 (2012-08-21 10:40:22) 转载▼ 标签: js 如果网页中一个 id为“no”的标签,暂且当div标签来tell:想要在js中设置这个div ...
- iOS设置状态栏样式
iOS设置状态栏样式可以使用两种方式. 方式一: 直接在需要改变默认状态栏样式的控制器中实现一个方法(其他任何事情都不用做): // 返回状态栏的样式 - (UIStatusBarStyle)pref ...
- react学习(四)之设置 css样式 篇
react中设置css样式 方法一: 行内样式:使用{{ }},与正常jsx中插入js代码不一样,这里需要两个括号. <div style={ { float: 'right',} }> ...
- JSX设置CSS样式详解
JSX设置CSS样式详解 1. 使用className设置样式(CSS的其他选择器也是同理) (1)定义一个CSS文件style.css,和普通CSS一样定义class选择器 .sty1{//和普通C ...
随机推荐
- WebApp分析建模的工具
最近Web工程课在学习分析建模工具的内容.这周作业就写我对WebApp建模工具的认识.Web建模工具有很多,但是专门为分析开发的却相对很少.下面介绍在进行分析时可以用的四类工具. UML工具.使用统一 ...
- Tomcat服务器集群与负载均衡实现
一.前言 在单一的服务器上执行WEB应用程序有一些重大的问题,当网站成功建成并开始接受大量请求时,单一服务器终究无法满足需要处理的负荷量,所以就有点显得有 点力不从心了.另外一个常见的问题是会产生单点 ...
- [Android Pro] 深入理解函数的调用过程——栈帧
cp :http://blog.csdn.net/x_perseverance/article/details/78897637 每一个函数被调用时,都会为函数开辟一块空间,这块空间就称为栈帧. 首先 ...
- Java与C/C++的比较(转)
原文链接:Java和c++比较 总结一下Java的小知识,只是想稍微提醒一下自己这些基础的东西,放在这里,随时可以阅览和添加一下,以免走错了方向. 1.面向对象程序设计 面向对象程序设计语言可以直观的 ...
- JVM编译优化
在部分的商用虚拟机中,Java 程序最初是通过解释器(Interpreter )进行解释执行的,当虚拟机发现某个方法或代码块的运行特别频繁的时候,就会把这些代码认定为“热点代码”.为了提高热点代码的执 ...
- CF 329B(Biridian Forest-贪心-非二分)
B. Biridian Forest time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- Qt解决:Qobject::connect queue arguments of type ‘xxxx’,Make sure ‘xxxx’ is registered using qRegister
解决方法:在调用connect之前,通过 qRegisterMetaType() 注册你connect函数里对象的类型代码如下: typedef QString CustomString;//你自己定 ...
- Asp.net WebApi版本控制
有关web api的版本控制网上有很多,如Web API 版本控制的几种方式 Web API 版本化的介绍 但是具体的code并不多,或者说可以run的demo 不多. 版本控制如果项目一开始还好做关 ...
- libnids使用举例
---[[ libnids应用实例 ]]---------------------------------- 1.nids_next()函数的应用 ========================== ...
- easyloader分析与使用
转载自:http://www.cnblogs.com/haogj/archive/2013/04/22/3036685.html 使用脚本库总要加载一大堆的样式表和脚本文件,在 easyui 中,除了 ...