Android 自定义简单控件--星级评价

效果图

实现

package com.easypass.carstong.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.support.annotation.AttrRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;

import com.easypass.carstong.R;

/**
 * Created by huangbo on 2017/8/1.
 */

public class ViewStar extends View {
    public static final int MAX_STAR = 5;

    public ViewStar(@NonNull Context context) {
        this(context, null);
    }

    public ViewStar(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ViewStar(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.StarView);
        mRating = typedArray.getFloat(R.styleable.StarView_rating, 0);
        typedArray.recycle();
        init();
    }

    Paint paint;
    Bitmap starYellow;
    Bitmap starGray;
    float mRating;
    int starWidth;
    int starHeight;
    int gap;

    private void init() {
        paint = new Paint();
        starYellow = BitmapFactory.decodeResource(getResources(), R.mipmap.rating_star_yellow);
        starGray = BitmapFactory.decodeResource(getResources(), R.mipmap.rating_star);
        starWidth = starYellow.getWidth();
        starHeight = starYellow.getHeight();
        gap = 5;
        invalidate();
    }

    public void setRating(float rating) {
        this.mRating = rating;
        invalidate();
    }

    public void setGrayStar(int resId, int alpha) {
        starGray = BitmapFactory.decodeResource(getResources(), resId);
        invalidate();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
        int width = (getPaddingLeft() + (starWidth + gap) * MAX_STAR + getPaddingRight());
        int height = (getPaddingTop() + starHeight + getPaddingBottom());
        setMeasuredDimension(widthMode == MeasureSpec.EXACTLY ? widthSize : width,
                heightMode == MeasureSpec.EXACTLY ? heightSize : height);

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        float currentRating = mRating < 0 ? 0 : (mRating > MAX_STAR ? MAX_STAR : mRating);
        int mLeft = 0;
        int mTop = 0;
        int full = (int) currentRating;/*整个星星的数量*/
        /**
         * 画黄色的整颗星
         */
        for (int i = 0; i < full; i++) {
            canvas.drawBitmap(starYellow, mLeft, mTop, paint);
            mLeft = mLeft + starWidth + gap;
        }

        if (currentRating == MAX_STAR) {
            return;
        }
        /**
         * 画灰色的整颗星
         */
        for (int i = full; i < MAX_STAR; i++) {
            canvas.drawBitmap(starGray, mLeft, mTop, paint);
            mLeft = mLeft + starWidth + gap;
        }

        /**
         * 画小数点部分的星
         */
        float part = mRating - full;
        if (part > 0) {
            int w = (int) (part * starWidth);
            Bitmap partBitmap = Bitmap.createBitmap(starYellow, 0, 0, w, starYellow.getHeight());
            canvas.drawBitmap(partBitmap, full * (starWidth + gap), mTop, paint);
        }

    }
}

使用方法

1.在布局文件中使用

<your.package.name.ViewStar
   android:layout_width="wrap_content"
   app:rating="2.5"
   android:layout_height="wrap_content"/>

2.在代码中使用

ViewStar star=new ViewStar(this);
star.setRating(1.5);
时间: 2024-10-25 07:23:50

Android 自定义简单控件--星级评价的相关文章

Android自定义用户控件简单范例(一)

一款优秀的移动应用需要具有自己独特统一的风格,通常情况下UI设计师会根据产品需求和使用人群的特点,设计整体的风格,界面的元素和控件的互效果.而原生态的Android控件为开发人员提供的是最基本的积木元素,如果要准确地传递统一的视觉效果和交互体验,对控件的自定义使用是非常有必要的. 这篇文章通过一个简单的从Java后台程序中进行创建的示例来说明Android自定义控件的运行原理. <LinearLayout xmlns:android="http://schemas.android.com/

Android自定义用户控件简单范例(二)

对于完全由后台定制的控件,并不是很方便其他人的使用,因为我们常常需要看到控件放到xml界面上的效果,并根据效果进行布局的调整,这就需要一个更加标准的控件制作流程: 我们的自定义控件和其他的控件一样,应该写成一个类,而这个类的属性是是有自己来决定的. 我们要在res/values目录下建立一个attrs.xml的文件,并在此文件中增加对控件的属性的定义. 使用AttributeSet来完成控件类的构造函数,并在构造函数中将自定义控件类中变量与attrs.xml中的属性连接起来. 在自定义控件类中使

Android 自定义组合控件小结

引言 接触Android UI开发的这段时间以来,对自定义组合控件有了一定的了解,为此小结一下,本文小结内容主要讨论的是如何使用Android SDK提供的布局和控件组成一个功能完整组合控件并将其封装为面向对象的类,而并非讨论如何继承自SDK提供的控件类(比如TextView),对其进行自定义扩展的问题. 进入正题前,我们先来看一组功能需求 假设在手机需求上,那么如上三个界面我们可以使用三个Activity,每个Activity一个布局文件,实现起来比较独立,但是假设在Android pad上要

Android自定义UI控件(简单方便版,但不灵活)

这种方法的优点就是简单,容易理解,适合开发一些不经常用到的自定义UI控件 缺点就是比较不灵活,如果其他应用想使用这个控件的话得改很多 简单来说,这个方法是用来做成品的,下一篇的方法是用来做模板的. 先看成品,这是一个标题栏控件: 由左右两个按钮和中一个TextView组成: 实现方法: 第一步:定义一个xml文件,用来设计你自定义控件的雏形 示例代码:文件名为title 1 <?xml version="1.0" encoding="utf-8"?> 2

Android自定义倒计时控件

序: 最近越来越多的APP都是用手机号注册,一是为了方便用户记忆,二是为了增加用户账户的安全性.在我们进行交易操作或者修改密码等操作的时候,这时候需要输入短信验证码.这个控件会需要有倒计时的功能,这里主要总结常见的几种实现方式. 1.Android中实现倒计时的方法 第一种:直接用Handler的消息机制来实现 这种方式感觉是最原始的,这里不多说. 第二种:Timer和TimerTask 基本使用:获得Timer和TimerTask对象,然后启动,倒计时的逻辑写在handler里面 privat

Android 自定义View控件

一.简介 在自定义View时,我们通常会重写onDraw()方法来绘制View的显示内容.如果,该View还需要使用wrap_content属性,那么还必须重写onMeasure()方法.另外,通过自定义attrs属性,还可以设置新的属性配置值. 在View中通常有以下一些比较重要的回调方法: onFinisInflate():从XML加载组件后回调: onSizeChanged():组件大小改变时回调: onMeasure():回调该方法来进行测量: onLayout():回调该方法来确定显示

Android自定义组合控件--底部多按钮切换

效果图: 现在市场上大多数软件都是类似于上面的结构,底部有几个按钮用于切换到不同的界面.基于OOP思想,我想把下面的一整块布局封装成一个类,也就是我们的自定义组合控件-底部多按钮切换布局,我把它叫做BottomLayout 看上面的布局,几个按钮横向排列,我们先看一下布局 最外面LinearLayout 方向 horizontal,然后5个weight相同的RelativeLayout,每个RelativeLayout里面有一个Button(用了显示选中状态)个ImageView(用来显示红点)

android自定义倒计时控件示例

这篇文章主要介绍了Android秒杀倒计时自定义TextView示例,大家参考使用吧 自定义TextView控件TimeTextView代码: 复制代码 代码如下: import android.content.Context;import android.content.res.TypedArray;import android.graphics.Paint;import android.text.Html;import android.util.AttributeSet;import and

android 自定义组合控件

自定义控件是一些android程序员感觉很难攻破的难点,起码对我来说是这样的,但是我们可以在网上找一些好的博客关于自定义控件好好拿过来学习研究下,多练,多写点也能找到感觉,把一些原理弄懂,今天就讲下自定义组合控件,这个特别适合在标题栏或者设置界面,看下面图: 就非常适合使用组合控件了,现在写一个玩玩: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"