Android App中使用RatingBar实现星级打分功能的教程

RatingBar简单介绍
RatingBar是基于SeekBar(拖动条)和ProgressBar(状态条)的扩展,用星形来显示等级评定,在使用默认RatingBar时,用户可以通过触摸/拖动/按键(比如遥控器)来设置评分, RatingBar自带有两种模式 ,一个小风格 ratingBarStyleSmall,大风格为ratingBarStyleIndicator,大的只适合做指示,不适用与用户交互。
自定义RatingBar需要注意的地方

一般情况下,系统自带的RatingBar是远远无法满足开发需求的,我们根据图片自定一个RatingBar,在开始实现自定义RatingBar之前,顺带说一下res目录下图片放置目录的区别:

在android sdk 1.5版本之前res目录下面只有一个drawable一个目录,在android sdk 1.6版本以后就出现了三个目录,分别是drawable-hdpi、drawable-ldpi、drawable-mdpi、drawable-xhdpi,
    (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854) 
    (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
    (3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)
    (4)drawable-xhdpi里面存放超大分辨率的图片,至少960dp x 720dp
由于我们自定义实现的RatingBar里面使用到的星形图片分辨率比较低,所以一般情况下,我们把图片放到drawable-mdpi或者drawable-ldpi里面。

自定义RatingBar的实现过程

首先,根据图片自定一个RatingBar的背景条,和图片放到同一个目录下面(比如drawable-mdpi),room_rating_bar.xml

<?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/star1"></item> <span></span>
    <item android:id="@+android:id/secondaryProgress"
    android:drawable="@drawable/star1"></item>
    <item android:id="@+android:id/progress"
  android:drawable="@drawable/star2"></item>
</layer-list>

backgroud:是用来填充背景图片的,和进度条非常类似,当我们设置最高评分时(android:numStars),系统就会根据我们的设置,来画出以星星为单位的背景(假如android:numStars="5",就会画出5颗灰色的星星)
    progress:是用来在背景图片基础上进行填充的指示属性(和进度条类似,第一进度位置)
    secondaryProgress:同progress一样属于第二进度位置(如果不定义这个,进度条拖动,每次就画出一整颗星星(亮),第二进度(暗)没有覆盖掉第一进度之后的位置,从左往右是拖不出来N.5颗星星的,这样评分效果就不完整)

其次,通过开始介绍,我们知道RatingBar的样式是通过style来切换的,在android中,我们可以通过在styles.xml文件中通过设置style属性,来继承我们需要自定控件类型,如下styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
 <style name="roomRatingBar" parent="@android:style/Widget.RatingBar">
  <item name="android:progressDrawable">@drawable/room_rating_bar</item>
  <item name="android:minHeight">16dp</item>
  <item name="android:maxHeight">16dp</item>
 </style>
</resources>

通过 parent属性来选择继承的父类,我们这里继承RatingBar类。
重新定义 progressDrawable属性(RatingBar的背景条,和我们在首先里面介绍的那样)
maxHeight和minHeight可以根据我们图片像素或者其他参考值来设定。

最后,在我们需要用到RatingBar的xml配置文件里面添加RatingBar控件。
main.xml

<RatingBar
  android:id="@+id/room_ratingbar"
  style="@style/roomRatingBar"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:numStars="5"
  android:rating="4"
  android:layout_marginLeft="10dp" >
</RatingBar>

打分功能实例
使用SeekBar与RatingBar共同实现:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:paddingBottom="@dimen/activity_vertical_margin"
 android:paddingLeft="@dimen/activity_horizontal_margin"
 android:paddingRight="@dimen/activity_horizontal_margin"
 android:paddingTop="@dimen/activity_vertical_margin"
 tools:context=".MainActivity" > 

 <SeekBar
  android:id="@+id/seekBar1"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  />
 <RatingBar
  android:id="@+id/ratingbar1"
  android:layout_height="wrap_content"
  android:layout_width="wrap_content"
  android:layout_below="@id/seekBar1"
  android:numStars="4"
  android:stepSize="0.5"
  />
 <Button
  android:id="@+id/button1"
  android:layout_height="wrap_content"
  android:layout_width="match_parent"
  android:layout_below="@id/ratingbar1"
  android:text="增加RatingBar的星数"/> 

</RelativeLayout>
package com.android.xiong.seekbars; 

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RatingBar;
import android.widget.RatingBar.OnRatingBarChangeListener;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener; 

public class MainActivity extends Activity { 

 private SeekBar seekBar1;
 private RatingBar ratingBar1;
 private Button button1; 

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  seekBar1=(SeekBar)findViewById(R.id.seekBar1);
  seekBar1.setMax(100);
  seekBar1.setSecondaryProgress(20);
  seekBar1.setProgress(10);
  SeekBarChangeListener seek=new SeekBarChangeListener();
  seekBar1.setOnSeekBarChangeListener(seek); 

  ratingBar1=(RatingBar)findViewById(R.id.ratingbar1);
  //设置RatingBar5颗星
  ratingBar1.setNumStars(4);
  //设置当前的星数
  ratingBar1.setRating(1.0f);
  //设置RatingBar 评分的步长
  ratingBar1.setStepSize(0.5f);
  RatingBarChangeLister rat=new RatingBarChangeLister();
  ratingBar1.setOnRatingBarChangeListener(rat); 

  button1=(Button)findViewById(R.id.button1);
  BuutonClick bu=new BuutonClick();
  button1.setOnClickListener(bu); 

 } 

 class SeekBarChangeListener implements OnSeekBarChangeListener { 

  /**
   * seekBar 当前触发的SeekBar控件
   * progress 当前的进度
   * fromUser 是否是用户触发 用户触发为true 否则为false
   */
  @Override
  public void onProgressChanged(SeekBar seekBar, int progress,
    boolean fromUser) {
   // TODO Auto-generated method stub
   System.out.println("progress:"+progress+" fromUser:"+fromUser); 

  }
  //此方法表示 开始拖动时触发的方法
  @Override
  public void onStartTrackingTouch(SeekBar seekBar) {
   // TODO Auto-generated method stub
   System.out.println(seekBar.getProgress()); 

  } 

  //拖动停止时触发的方法
  @Override
  public void onStopTrackingTouch(SeekBar seekBar) {
   // TODO Auto-generated method stub
   System.out.println(seekBar.getProgress());
  } 

 } 

 class RatingBarChangeLister implements OnRatingBarChangeListener{
  /**
   * rattingBar当前触发的RatingBar控件
   * rating 当前的星数
   * fromUser 是否是用户触发
   */ 

  @Override
  public void onRatingChanged(RatingBar ratingBar, float rating,
    boolean fromUser) {
   // TODO Auto-generated method stub 

   System.out.println("rating:"+ rating +" fromUser:"+fromUser); 

  } 

 } 

 class BuutonClick implements OnClickListener{ 

  @Override
  public void onClick(View arg0) {
   // TODO Auto-generated method stub
   ratingBar1.setRating(ratingBar1.getRating()+0.5f); 

  } 

 }
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
  // Inflate the menu; this adds items to the action bar if it is present.
  getMenuInflater().inflate(R.menu.main, menu);
  return true;
 } 

} 
(0)

相关推荐

  • android之RatingBar控件用法详解

    MainActivity.java package com.example.mars_2500_ratingbar; import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBar; import android.support.v4.app.Fragment; import android.app.Activity; import android.os.Bundle; import

  • Android自定义View之自定义评价打分控件RatingBar实现自定义星星大小和间距

    在Android开发中,我们经常会用到对商家或者商品的评价,运用星星进行打分.然而在Android系统中自带的打分控件,RatingBar特别不好用,间距和大小无法改变.所以,我就自定义了一个特别好用的打分控件.在项目中可以直接使用,特别简单.下面直接上图: 效果图 实现原理 其实就是自定义View继承LinearLayout ,然后里面动态加了五个ImageView. 实现代码,有详细的注释 在attrs中声明的可以在xml中设置的变量 <declare-styleable name="

  • Android评分控件RatingBar使用实例解析

    无论游戏,应用,网站,都少不了评分控件.在Android SDK 中提供了 RatingBar控件来实现相应的工作. <RatingBar/>标签有几个常用评分相关属性 android:numStars,指定评分五角星数. android:rating,指定当前分数 android:stepSize, 指定分数增量 <RatingBar/>还有3种 常用的style属性 默认style 就是ratingBarStyle style ratingBarStyleIndicator 不

  • Android星级评分条控件RatingBar使用详解

    Android开发中,时不时的就有要实现星星的评分效果,比如某宝,某团,相信大家也都见过,当然了我们可以自己去画,也可以用美工给切的图去实现,其实在Android原生的控件中就可以来实现这样的效果,它就是RatingBar. 来,我们先看一张图(只在代码中引入了控件) 实现效果如下图: 我们先看一下它的继承关系:这玩意和SeekBar的类结构是一样的,也是ProgressBar的子类 相关属性: android:isIndicator:是否用作指示,用户无法更改,默认false android:

  • Android自定义控件RatingBar调整字体大小

    项目需要,做一个可以调整字体大小的控件,能在滑动或点击时改变选中的位置,效果图如下: 这是一个类似于RatingBar的控件,然而配置RatingBar的样式难以实现这样的效果,如选中的图案和上面的文字对齐.因此,有必要写一个自定义View来实现. 思路如下: 新建一个TextRatingBar继承View类 在onDraw()方法中绘制元素:文字.横线.短竖线和圆形标记 重写onMeasure()方法,控制整体大小和边界 在onTouchEvent()方法中处理ACTION_DOWN和ACTI

  • Android RatingBar星星评分控件实例代码

    效果图: 直接上代码: xml文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http:

  • Android UI控件RatingBar实现自定义星星评分效果

    本文实例为大家分享了Android RatingBar星星评分效果的具体代码,供大家参考,具体内容如下 继承关系 AppCompatRatingBar 效果图 xml <RatingBar style="@android:style/Widget.DeviceDefault.RatingBar.Small" android:layout_width="wrap_content" android:layout_height="wrap_content&

  • Android中SeekBar和RatingBar用法实例分析

    本文实例讲述了Android中SeekBar和RatingBar用法.分享给大家供大家参考,具体如下: 什么是SeekBar? 可以拖动的进度条(在播放器中使用最常见) 1.在布局文件中声明 <SeekBar android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/seekBar" /> 2.定义一个OnSeekB

  • Android控件之RatingBar自定义星级评分样式

    一.RatingBar简单介绍 RatingBar是基于SeekBar(拖动条)和ProgressBar(状态条)的扩展,用星形来显示等级评定,在使用默认RatingBar时,用户可以通过触摸/拖动/按键(比如遥控器)来设置评分, RatingBar自带有两种模式 ,一个小风格 ratingBarStyleSmall,大风格为ratingBarStyleIndicator,大的只适合做指示,不适用与用户交互. 效果图展示: 二.实例 1.布局文件 <?xml version="1.0&qu

  • Android App中使用RatingBar实现星级打分功能的教程

    RatingBar简单介绍 RatingBar是基于SeekBar(拖动条)和ProgressBar(状态条)的扩展,用星形来显示等级评定,在使用默认RatingBar时,用户可以通过触摸/拖动/按键(比如遥控器)来设置评分, RatingBar自带有两种模式 ,一个小风格 ratingBarStyleSmall,大风格为ratingBarStyleIndicator,大的只适合做指示,不适用与用户交互. 自定义RatingBar需要注意的地方 一般情况下,系统自带的RatingBar是远远无法

  • 如何在Android App中集成支付宝和微信支付功能

    前言 本文主要介绍如何在 Android App 里集成支付宝和微信支付的功能,文中将实现的步骤一步步介绍的非常详细,对同样遇到这个问题的朋友相信会是一个很好的参考,下面话不多说了,来一起看看详细的介绍吧. 集成支付宝支付 没想到现在 App 里集成支付宝是这么的简单,我还折腾了好久- 好了,开始,假设你已经完成了支付宝那些繁杂的申请啥的工作,进入开发了. 首先,去下载官方的 DEMO : App支付客户端DEMO&SDK. 导入开发资源 解压后把里面的 jar 包拿出来放到你工程的 lib 目

  • Android App中进行语言的切换

    本篇简单介绍将在Android App中进行语言的切换和使用dragonFace改系统语言. 切换语言 首先需要在res 中创建个若干个不同的value文件夹(例如:values.values-en.value-ja).然后将不同的String.xml文件. 这里为 中.英.日三语切换.(value文件夹命名可以参考下面) 在res目錄下建立不同名稱的values文件來調用不同的語言包 Values文件匯總如下: 中文(中國):values-zh-rCN中文(台灣):values-zh-rTW

  • 如何在Android App中接入微信支付

    本篇简单介绍Android App中接入微信支付,包括App内支付和扫码支付.分享+支付 pofei 微信支付 wechat 官方接入文档 App内支付 源码下载 主要流程: 1.微信支付平台注册账号​ 注:注册并申请成功以后,需要在API安全中设置你的API密钥 32个字符.建议使用 MD5加密 ,并且需要妥善的保存.因为无法查看. 2.生成预支付订单 3.生成签名参数 4.调起微信,完成支付 扫码支付 扫码支付使用的是微信统一下单API ,使用的是模式二,模式一 一直说URL参数错误,完全按

  • Android编程中Intent实现页面跳转功能详解

    本文实例讲述了Android编程中Intent实现页面跳转功能.分享给大家供大家参考,具体如下: 安卓四大组件:Activity.Service.Broadcast Receiver.Content Provider Intent实现页面之间跳转 1.无返回值 startActivity(intent) 2.有返回值 startActivityForResult(intent,requestCode); onActivityResult(int requestCode,int resultCod

  • Android Studio中快捷键实现try catch等功能包含代码块的实现方法

     Android Studio中快捷键实现try catch等功能包含代码块 1.windows系统下,只需选中需包含的代码块,按快捷键Ctry+Alt+T即可: 2.Ubuntu下由于快捷键已经被占用,故需要自行重新设定,设定过程如下: 点击file--->setting--->keymap 在右侧搜索栏中搜索surround,选中Surround With...,先点击右键,选择Remove Ctrl+Alt+T,然后再设置可行的快捷键即可. 如有疑问请留言或者到本站社区交流讨论,感谢阅读

  • 通过实例简单讲解Android App中的Activity组件

    Activity是Android应用中,最直接与用户接触的组件,它负责加载View组件,使其展现给用户,并保持与用户的交互.所有的Activity组件均需要继承Activity类,这是一个Content的间接子类,包装了一些Activity的基本特性. View组件是所有UI组件.容器组件的基类,也就是说,它可以是一个布局容器,也可以是一个布局容器内的基本UI组件.View组件一般通过XML布局资源文件定义,同时Android系统也对这些View组件提供了对应的实现类.如果需要通过某个Activ

  • Android App中各种数据保存方式的使用实例总结

    少量数据保存之SharedPreferences接口实例 SharedPreferences数据保存主要是通过键值的方式存储在xml文件中 xml文件在data/此程序的包名/XX.xml. 格式: <?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <int name="count" value="3" /> <string name="t

  • Android App中实现可以双击放大和缩小图片功能的实例

    先来看一个很简单的核心图片缩放方法: public static Bitmap scale(Bitmap bitmap, float scaleWidth, float scaleHeight) { int width = bitmap.getWidth(); int height = bitmap.getHeight(); Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); Log.i(TAG, "s

随机推荐