项目在我的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. 一分钟掌握Android spinner下拉框

    Android 自带的spinner下拉框控件是一个不错的系统控件.主要有两种实现方式: 1.静态的spinner 在res\values中加入一个city资源数组文件 2 <resources ...

  2. SharePoint Online 创建资产库

    前言 本文介绍如何在Office 365中创建资产库库,以及资产库的一些基本设置. 正文 通过登录地址登录到Office 365的SharePoint Online站点中,我们可以在右上角的设置菜单中 ...

  3. Swift - 绘制背景线条

    Swift - 绘制背景线条 效果 源码 // // BackgroundLineView.swift // LineBackgroundView // // Created by YouXianMi ...

  4. 调用人人网API

    大致步骤与上篇调用新浪微博API类似.只是感觉新浪微博的做的更好一些,人人网的非常多要手动操作 与新浪微博类似,先在人人网开放平台http://dev.renren.com/注冊站内应用, 把该填的填 ...

  5. [转]php 操作数组 (合并,拆分,追加,查找,删除等)

    From : http://justcoding.iteye.com/blog/1181962 1. 合并数组 array_merge()函数将数组合并到一起,返回一个联合的数组.所得到的数组以第一个 ...

  6. MySQL C API的一个让我头疼的问题,获得一行记录中包括NULL

    遇到过几次错误,通过gdb来查看错误对战,发现错误居然是atoi调用出错,除非atoi(NULL) 才会报这种错误.说明 row[0]==NULL. (gdb) bt #0 0x00007f82c66 ...

  7. REST构架风格介绍之一:状态表述转移

    转载自:Todd Wei   http://www.cnblogs.com/weidagang2046/archive/2009/05/08/1452322.html REST(Representat ...

  8. 轻松搞定 easyui datagrid 二次加载的问题(转)

    对于使用url方式的初学者,经常碰到重复请求的问题,这个问题的根源是因为一旦设置了url参数,Datagrid组件在实例化的时候就会做请求,如何避免二次加载这样问题呢,个人觉得注意以下两点基本就可以防 ...

  9. iOS开发-UITextField手机号和邮箱验证

    不管是网页是手机,用户注册登录的时候绝大数时候都需要手机号码和邮箱地址,而且有些App会限制只能使用手机号注册,iOS方面邮箱正则比较简单,不过手机号码验证找了一下网上的,发现三大运营商的号码段有所变 ...

  10. Improve your code with lint checks

    官方文档 使用 Lint 改进您的代码 [Improve your code with lint checks] 除了[In addition to]测试 Android 应用以确保其符合功能要求[m ...