项目在我的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,能依据设置改变样式的更多相关文章

  1. css003 选择器:明确设置哪些样式

    css003 选择器:明确设置哪些样式 1.每个样式的两个部分:选择器和声明块 1.标签选择器:整体控制 2.类选择器:精确控制(.+字母.数字.连字符或下划线) Css允许的类名为.+字母.数字.连 ...

  2. JS设置CSS样式的几种方式

    用JS来动态设置CSS样式,常见的有以下几种 1. 直接设置style的属性  某些情况用这个设置 !important值无效 如果属性有'-'号,就写成驼峰的形式(如textAlign)  如果想保 ...

  3. JS设置CSS样式的几种方式【转】

    用JS来动态设置CSS样式,常见的有以下几种 1. 直接设置style的属性  某些情况用这个设置 !important值无效 如果属性有'-'号,就写成驼峰的形式(如textAlign)  如果想保 ...

  4. ReactJs设置css样式

    前段时间看了React Native,但是感觉在安卓反面的开发并不成熟.有较多功能有待完善,而且自己在实际运用的过程中在一些模块上遇到了不晓得阻力,又苦于网上没有找到那么多资源.于是打算先放一段时间, ...

  5. web appbuilder 改变样式和添加自定义widget

    一.改变样式 要实现的效果是添加cyan样式 1.将FoldableTheme/style下的cyan copy到TabTheme下的同一目录下: 2.打开TabTheme下的manifest,cop ...

  6. cssText设置css样式

    js中用cssText设置css样式 (2012-08-21 10:40:22) 转载▼ 标签: js   如果网页中一个 id为“no”的标签,暂且当div标签来tell:想要在js中设置这个div ...

  7. iOS设置状态栏样式

    iOS设置状态栏样式可以使用两种方式. 方式一: 直接在需要改变默认状态栏样式的控制器中实现一个方法(其他任何事情都不用做): // 返回状态栏的样式 - (UIStatusBarStyle)pref ...

  8. react学习(四)之设置 css样式 篇

    react中设置css样式 方法一: 行内样式:使用{{  }},与正常jsx中插入js代码不一样,这里需要两个括号. <div style={ { float: 'right',} }> ...

  9. JSX设置CSS样式详解

    JSX设置CSS样式详解 1. 使用className设置样式(CSS的其他选择器也是同理) (1)定义一个CSS文件style.css,和普通CSS一样定义class选择器 .sty1{//和普通C ...

随机推荐

  1. 自定义兼容多种Protobuf协议的编解码器

    <从零开始搭建游戏服务器>自定义兼容多种Protobuf协议的编解码器 直接在protobuf序列化数据的前面,加上一个自定义的协议头,协议头里包含序列数据的长度和对应的数据类型,在数据解 ...

  2. SQL:修复脚本的几点注意事项

    背景 系统上线之后一定会出现需求变动,某些需求变动要求会对系统数据产生影响,因此需要修复脚本,本文介绍修复脚本的几点事项. 注意事项 包含在事务中 使用事务,但是先rollback tran,在真实环 ...

  3. Git:远程仓库的使用

    查看当前的远程库 要查看当前配置有哪些远程仓库,可以用git remote 命令,它会列出每个远程库的简短名字.在克隆完某个项目后,至少可以看到一个名为origin 的远程库,Git 默认使用这个名字 ...

  4. python测试开发django-13.操作数据库(增删改查)

    前言 django的models模块里面可以新增一张表和字段,通常页面上的数据操作都来源于数据库的增删改查,django如何对msyql数据库增删改查操作呢? 本篇详细讲解django操作mysql数 ...

  5. String Matching(poj1580)

    /*String Matching Description It's easy to tell if two words are identical - just check the letters. ...

  6. Unity Shader _Time 的单位

    名称 类型 说明 _Time float4 t 是自该场景加载开始所经过的时间,4个分量分别是 (t/20, t, t*2, t*3) _SinTime float4 t 是时间的正弦值,4个分量分别 ...

  7. 使用kubectl创建部署

    本文使用自己利用VirtubalBox搭建的集群环境,暂时只有一个Master.一个Node.如果想了解集群的搭建,可以参考我的文章离线环境安装Kubernetes集群以及使用kubeadm安装kub ...

  8. IE8 MIME type application/json not found

    如果: public ContentResult GetPaper(string testId) {     return ControllProctector.Do1(() =>        ...

  9. golang的日志系统log和glog

    go语言有一个标准库,log,提供了最基本的日志功能,但是没有什么高级的功能,如果需要高级的特性,可以选择glog或log4go. 参考:https://cloud.tencent.com/devel ...

  10. [转]Chart.js入门教程

    Chart.js是一个简单.面向对象.为设计者和开发者准备的图表绘制工具库. 相信大部分人都一样,看到一大筐用文本或者表格形式呈现的数据就头疼.因为这种呈现方式也太无聊了吧...而且这对于我们处理原始 ...