服务评价(星标控件)

初次学习这个控件参考了一些资料:
参考地址:http://blog.csdn.net/a756213932/article/details/51939422
在这里自定义了一个StartBar控件,以下是自定义控件代码:
`
package com…… ;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com……
import……;

/**
* Created by xxxxx on 2016/9/21.
* 自定义评级星标的控件
*/

public class StartBar extends View {

private int starDistance = 10;  //星星间的距离
private int starCount = 5;      //星星的个数
private int starSize;           //星星的大小,一般类似于正方形,宽度等于高度
private float starMark = 0.0f;  //评价星星
private Bitmap starFillBitmap;  //亮星星
private Drawable starEmptyDrawable;  //暗星星
private OnStarChangeListener onStarChangeListener; //监听星星变化接口
private Paint paint; //绘制星星的画笔
private boolean integerMark = false;

public StartBar(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context,attrs);
}

public StartBar(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context,attrs);
}

private void init(Context context, AttributeSet attrs) {
    setClickable(true);
    TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.RatingBar);
    this.starDistance = (int) mTypedArray.getDimension(R.styleable.RatingBar_starDistance,0);
    this.starSize = (int) mTypedArray.getDimension(R.styleable.RatingBar_starSize, 20);
    this.starCount = mTypedArray.getInteger(R.styleable.RatingBar_starCount, 5);
    this.starEmptyDrawable = mTypedArray.getDrawable(R.styleable.RatingBar_starEmpty);
    this.starFillBitmap = drawableToBitmap(mTypedArray.getDrawable(R.styleable.RatingBar_starFill));
    mTypedArray.recycle();

    paint = new Paint();
    paint.setAntiAlias(true);
    paint.setShader(new BitmapShader(starFillBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));
}

//设置是否要评分(设置为true时,则会取整显示)
  public void setIntegerMark(boolean integerMark){
      this.integerMark = integerMark;
  }

/**
 * 设置显示的星星分数
 */
public void setStarMark(float mark){
    if (integerMark) {
        starMark = (int)Math.ceil(mark);
    }else {
        starMark = Math.round(mark * 10) * 1.0f / 10;
    }
    if (this.onStarChangeListener != null) {
        this.onStarChangeListener.onStarChange(starMark);  //调用监听接口
    }
    invalidate();    //设置星星调invalidate()方法,重新绘制
}

/**
 * 获取显示星星的数目
 *
 * @return starMark
 */
public float getStarMark(){
    return starMark;
}

/**
 * 定义星星点击的监听接口
 */
public interface OnStarChangeListener {
    void onStarChange(float mark);
}

/**
 * 设置监听
 * @param onStarChangeListener
 */
public void setOnStarChangeListener(OnStarChangeListener onStarChangeListener){
    this.onStarChangeListener = onStarChangeListener;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    setMeasuredDimension(starSize * starCount + starDistance * (starCount - 1), starSize);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (starFillBitmap == null || starEmptyDrawable == null) {
        return;
    }
    for (int i = 0;i < starCount;i++) {
        starEmptyDrawable.setBounds((starDistance + starSize) * i, 0, (starDistance + starSize) * i + starSize, starSize);
        starEmptyDrawable.draw(canvas);
    }
    if (starMark > 1) {
        canvas.drawRect(0, 0, starSize, starSize, paint);
        if(starMark-(int)(starMark) == 0) {
            for (int i = 1; i < starMark; i++) {
                canvas.translate(starDistance + starSize, 0);
                canvas.drawRect(0, 0, starSize, starSize, paint);
            }
        }else {
            for (int i = 1; i < starMark - 1; i++) {
                canvas.translate(starDistance + starSize, 0);
                canvas.drawRect(0, 0, starSize, starSize, paint);
            }
            canvas.translate(starDistance + starSize, 0);
            canvas.drawRect(0, 0, starSize * (Math.round((starMark - (int) (starMark))*10)*1.0f/10), starSize, paint);
        }
    }else {
        canvas.drawRect(0, 0, starSize * starMark, starSize, paint);
    }
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    int x = (int) event.getX();
    if (x < 0) x = 0;
    if (x > getMeasuredWidth()) x = getMeasuredWidth();
    switch(event.getAction()){
        case MotionEvent.ACTION_DOWN: {
            setStarMark(x*1.0f / (getMeasuredWidth()*1.0f/starCount));
            break;
        }
        case MotionEvent.ACTION_MOVE: {
            setStarMark(x*1.0f / (getMeasuredWidth()*1.0f/starCount));
            break;
        }
        case MotionEvent.ACTION_UP: {
            break;
        }
    }
    invalidate();   //点击控件调invalidate()方法,重新绘制
    return super.onTouchEvent(event);
}

}

`

attrs中设置

<!--评价时的星星组件-->
    <declare-styleable name="RatingBar">
        <!--星星间距-->
        <attr format="dimension" name="starDistance"/>
        <!--星星大小-->
        <attr format="dimension" name="starSize"/>
        <!--星星个数-->
        <attr format="integer" name="starCount"/>
        <!--星星空图-->
        <attr format="reference" name="starEmpty"/>
        <!--星星满图-->
        <attr format="reference" name="starFill"/>
    </declare-styleable>

这里附上需要的xml

<com.xxxx.android.ui.percenter.StartBar
                android:id="@+id/starBar"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                ratingbar:starEmpty="@mipmap/a_a_a_a"
                ratingbar:starFill="@mipmap/a_a_a_a_b"
                ratingbar:starDistance="10dp"
                ratingbar:starCount="5"
                ratingbar:starSize="30dp">
            </com.xxxx.android.ui.percenter.StartBar>

在相关类里面设置分数进行测试
这里写图片描述

之后继续看了相关的资料:android有自带的星级评价控件,RatingBar
大概说一下使用方法:

在XML里面
<RatingBar
android:id="@+id/starBar1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
style="@style/foodRatingBar"/>

drawable中设置:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background"
        android:drawable="@drawable/a_a_a_a" />
    <item android:id="@android:id/secondaryProgress"
        android:drawable="@drawable/a_a_a_a" />
    <item android:id="@android:id/progress"
        android:drawable="@drawable/a_a_a_a_b" />
</layer-list>

style中

 <style name="foodRatingBar" parent="@android:style/Widget.RatingBar">
    <item name="android:progressDrawable">@drawable/aa</item>
    <item name="android:minHeight">48dip</item>
    <item name="android:maxHeight">48dip</item>
    </style>

相关class
`
/**
* Created by xxx on 2016/9/21.
* 个人中心:评价商品
*/

public class EvaluationProductActivity extends BaseNetActivity{
private StartBar starBar;
private RatingBar starBar1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.center_pers_evalua_prod_activity);
// starBar= (StartBar) findViewById(R.id.starBar);
// starBar.setIntegerMark(true);
//starBar.setStarMark(4.0f);
starBar1= (RatingBar) findViewById(R.id.starBar1);
starBar1.setMax(100);
starBar1.setProgress(50);
starBar1.setStepSize(0.5f);

// starBar1.setRating(50f);

}

`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值