日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

星星评价控件android开发_android自定义星级评分控件,可实现只显示实心星星

發(fā)布時(shí)間:2024/9/19 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 星星评价控件android开发_android自定义星级评分控件,可实现只显示实心星星 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

話不多說(shuō),上圖

近日app需求弄一個(gè)等級(jí)展示,看了下UI圖,只顯示實(shí)星(點(diǎn)亮的星星).如圖

但是網(wǎng)上關(guān)于星級(jí)評(píng)分的例子大多這樣

也展示虛心星星

通過(guò)自定義Viewpackage com.starsbar;

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;

public class StarBar extends View {

private int starDistance = 0; //星星間距

private int starCount = 5; //星星個(gè)數(shù)

private int starSize; //星星高度大小,星星一般正方形,寬度等于高度

private float starMark = 0.0F; //評(píng)分星星

private Bitmap starFillBitmap; //亮星星

private Drawable starEmptyDrawable; //暗星星

private OnStarChangeListener onStarChangeListener;//監(jiān)聽(tīng)星星變化接口

private Paint paint; //繪制星星畫(huà)筆

private boolean integerMark = false;

private boolean clickAble = true;

public StarBar(Context context, AttributeSet attrs) {

super(context, attrs);

init(context, attrs);

}

public StarBar(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

init(context, attrs);

}

/**

* 初始化UI組件

*/

private void init(Context context, AttributeSet attrs) {

setClickable(true);

TypedArray mTypedArray = context.obtainStyledAttributes(attrs, R.styleable.StarBar);

this.starDistance = (int) mTypedArray.getDimension(R.styleable.StarBar_starDistance, 0);

this.starSize = (int) mTypedArray.getDimension(R.styleable.StarBar_starSize, 20);

this.starCount = mTypedArray.getInteger(R.styleable.StarBar_starCount, 5);

this.starEmptyDrawable = mTypedArray.getDrawable(R.styleable.StarBar_starEmpty);

this.starFillBitmap = drawableToBitmap(mTypedArray.getDrawable(R.styleable.StarBar_starFill));

mTypedArray.recycle();

paint = new Paint();

paint.setAntiAlias(true);

paint.setShader(new BitmapShader(starFillBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP));

}

/**

* 設(shè)置星星是否可以點(diǎn)擊和滑動(dòng)改變

*/

public void setClickAble(boolean clickAble) {

this.clickAble = clickAble;

}

/**

* 設(shè)置是否需要整數(shù)評(píng)分

*

* @param integerMark

*/

public void setIntegerMark(boolean integerMark) {

this.integerMark = integerMark;

}

/**

* 設(shè)置顯示的星星的分?jǐn)?shù)

*

* @param mark

*/

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); //調(diào)用監(jiān)聽(tīng)接口

}

invalidate();

}

/**

* 獲取顯示星星的數(shù)目

*

* @return starMark

*/

public float getStarMark() {

return starMark;

}

/**

* 定義星星點(diǎn)擊的監(jiān)聽(tīng)接口

*/

public interface OnStarChangeListener {

void onStarChange(float mark);

}

/**

* 設(shè)置監(jiān)聽(tīng)

*

* @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);

}

}

/**

* 設(shè)置星星總數(shù)

*/

public void setStarCount(int count){

starCount = count;

}

/**

* 設(shè)置星星亮的顆數(shù)

*/

public void setRating(int rating){

if (integerMark) {

starMark = (int) Math.ceil(rating);

} else {

starMark = Math.round(rating * 10) * 1.0f / 10;

}

if (this.onStarChangeListener != null) {

this.onStarChangeListener.onStarChange(starMark); //調(diào)用監(jiān)聽(tīng)接口

}

invalidate();

}

@Override

public boolean onTouchEvent(MotionEvent event) {

if (clickAble) {

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();

}

return super.onTouchEvent(event);

}

/**

* drawable轉(zhuǎn)bitmap

*

* @param drawable

* @return

*/

private Bitmap drawableToBitmap(Drawable drawable) {

if (drawable == null) return null;

Bitmap bitmap = Bitmap.createBitmap(starSize, starSize, Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

drawable.setBounds(0, 0, starSize, starSize);

drawable.draw(canvas);

return bitmap;

}

}

解決方案,為了只顯示實(shí)心數(shù),加了2個(gè)方法,注意:/**

* 設(shè)置星星總數(shù)

*/

public void setStarCount(int count){

starCount = count;

}

/**

* 設(shè)置星星亮的顆數(shù)

*/

public void setRating(int rating){

if (integerMark) {

starMark = (int) Math.ceil(rating);

} else {

starMark = Math.round(rating * 10) * 1.0f / 10;

}

if (this.onStarChangeListener != null) {

this.onStarChangeListener.onStarChange(starMark); //調(diào)用監(jiān)聽(tīng)接口

}

invalidate();

}

在activity中配合使用即可實(shí)現(xiàn)上述需求://不可選擇的starBar,只做顯示用 不顯示空心

starBar2=findViewById(R.id.starBar2);

starBar2.setClickAble(false);

starBar2.setStarCount(3);

starBar2.setRating(3);

另介紹另外一種星級(jí)評(píng)分 YStarView

總結(jié)

以上是生活随笔為你收集整理的星星评价控件android开发_android自定义星级评分控件,可实现只显示实心星星的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。