热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android自定义星星可滑动评分控件

这篇文章主要介绍了Android自定义星星可滑动评分控件,通过线性布局结合ImageView实现评分控件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了Android自定义星星可滑动评分控件的具体方法,供大家参考,具体内容如下

此控件通过线性布局结合ImageView来实现。

具有展示分数,滑动评分功能,可设置0-10分,自行设置星星图片,是否可点击与滑动,星星间距。

效果如下:

需准备好下面三张图片

先看自定义属性:

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  
    
    
    
    
    
    
    
    
    
    
  



布局文件

<&#63;xml version="1.0" encoding="utf-8"&#63;>

  
  

  

第一个控件star:ratable设置为false,只具备展示功能。第二个为true,可进行滑动评分并把分数显示到TextView上。

下面是控件代码

public class StarRatingView extends LinearLayout{
  private Drawable on,off,half;  //星星三种图片
  private boolean ratable;  //是否点击滑动
  private float padding; //星星之间间距
  private List list;  //存放五颗星星
  private float points[] = new float[11];  //0-10分点的x坐标,index为分数,值为此分数为坐标
  private float starWidth;  //设置的星星图片宽度
  private float halfStarWidth;  //半个星星宽度
  private int paddingLeft;    //控件左padding
  private OnRateChangeListener onRateChangeListener;

  public StarRatingView(Context context) {
    super(context);
  }

  public StarRatingView(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.StarRatingView);
    on = array.getDrawable(R.styleable.StarRatingView_stat_on);
    off = array.getDrawable(R.styleable.StarRatingView_stat_off);
    half = array.getDrawable(R.styleable.StarRatingView_stat_half);
    ratable = array.getBoolean(R.styleable.StarRatingView_ratable, false);
    halfStarWidth = on.getIntrinsicWidth() / 2;
    starWidth = on.getIntrinsicWidth();
    padding = array.getDimension(R.styleable.StarRatingView_star_padding, starWidth / 3);
    paddingLeft = getPaddingLeft();
    list = new ArrayList<>();
    ImageView imageView;
    //初始化五个星星,并通过points数组把分数与坐标对应起来
    for(int i=0;i<5;i++){
      imageView = new ImageView(context);
      LinearLayout.LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
      if(i!=0&&i!=4) {
        //设置间距
        layoutParams.setMargins((int) padding / 2, 0, (int) padding / 2, 0);
        //分数点所在的x坐标
        points[i*2] = i*starWidth+i*padding;
        points[i*2+1] = points[i*2]+halfStarWidth/2;
      }
      //第一个左边和最后一个右边不设置间距
      if(i==0){
        layoutParams.setMargins(0, 0, (int) padding / 2, 0);
        points[0] = 0;
        points[1] = halfStarWidth;
      }
      if(i==4){
        layoutParams.setMargins((int) padding / 2, 0, 0, 0);
        points[i*2] = i*starWidth+i*padding;
        points[i*2+1] = points[i*2]+halfStarWidth/2;
        points[10] = points[9]+halfStarWidth/2;
      }
      imageView.setLayoutParams(layoutParams);
      imageView.setImageDrawable(off);
      list.add(imageView);
      addView(list.get(i));
    }
    setOrientation(LinearLayout.HORIZONTAL);
    array.recycle();
  }

  /**
   *根据分数显示星星
   * @param rate
   */
  public void setRate(int rate){
    removeAllViews();
    int count = rate/2;
    boolean isOdd;
    if(rate%2==0){
      isOdd = false;
    }else{
      isOdd = true;
    }
    for(int i=0;irealPosition){
        return i;
      }
    }
    //如果循环结束即为右滑超出最大值,返回10分
    return 10;
  }

  /**
   * 评分改变的回调
   */
  public interface OnRateChangeListener{
    void onRateChange(int rate);
  }
}

基本实现原理是通过坐标计算分数,然后根据分数设置每个ImageView显示不同三张星星图片,根据ratable变量判断是否处理触摸事件,通过触摸位置在坐标数组point[]的位置,确定index,即为分数。并通过OnRateChangeListener通知分数的改变。

最后为Activity代码

public class MainActivity extends AppCompatActivity {

 private int count;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  final StarRatingView srv = (StarRatingView) findViewById(R.id.srv);
  findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
   @Override
   public void onClick(View v) {
    count++;
    srv.setRate(count);
   }
  });
  final TextView tv = (TextView) findViewById(R.id.tv);
  StarRatingView srv_ratable = (StarRatingView) findViewById(R.id.srv_ratable);
  srv_ratable.setOnRateChangeListener(new StarRatingView.OnRateChangeListener() {
   @Override
   public void onRateChange(int rate) {
    tv.setText(rate+"分");
   }
  });
 }

}

GitHub地址StarRatingView

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 在Android开发中,BroadcastReceiver(广播接收器)是一个重要的组件,广泛应用于多种场景。本文将深入解析BroadcastReceiver的工作原理、应用场景及其具体实现方法,帮助开发者更好地理解和使用这一组件。通过实例分析,文章详细探讨了静态广播的注册方式、生命周期管理以及常见问题的解决策略,为开发者提供全面的技术指导。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 提升Android开发效率:Clean Code的最佳实践与应用
    在Android开发中,提高代码质量和开发效率是至关重要的。本文介绍了如何通过Clean Code的最佳实践来优化Android应用的开发流程。以SQLite数据库操作为例,详细探讨了如何编写高效、可维护的SQL查询语句,并将其结果封装为Java对象。通过遵循这些最佳实践,开发者可以显著提升代码的可读性和可维护性,从而加快开发速度并减少错误。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • ButterKnife 是一款用于 Android 开发的注解库,主要用于简化视图和事件绑定。本文详细介绍了 ButterKnife 的基础用法,包括如何通过注解实现字段和方法的绑定,以及在实际项目中的应用示例。此外,文章还提到了截至 2016 年 4 月 29 日,ButterKnife 的最新版本为 8.0.1,为开发者提供了最新的功能和性能优化。 ... [详细]
  • REST与RPC:选择哪种API架构风格?
    在探讨REST与RPC这两种API架构风格的选择时,本文首先介绍了RPC(远程过程调用)的概念。RPC允许客户端通过网络调用远程服务器上的函数或方法,从而实现分布式系统的功能调用。相比之下,REST(Representational State Transfer)则基于资源的交互模型,通过HTTP协议进行数据传输和操作。本文将详细分析两种架构风格的特点、适用场景及其优缺点,帮助开发者根据具体需求做出合适的选择。 ... [详细]
  • 本文探讨了如何有效地构建和优化微信公众平台账号,涵盖了用户信息管理、内容创作与发布、互动策略及数据分析等方面。通过合理设置用户信息字段,如用户名、昵称、密码、真实姓名和性别等,确保账号的安全性和用户体验。同时,文章还介绍了如何利用微信公众平台的各项功能,提升用户参与度和品牌影响力。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 如何高效利用Hackbar插件提升网页调试效率
    通过合理利用Hackbar插件,可以显著提升网页调试的效率。本文介绍了如何获取并使用未包含收费功能的2.1.3版本,以确保在不升级到最新2.2.2版本的情况下,依然能够高效进行网页调试。此外,文章还提供了详细的使用技巧和常见问题解决方案,帮助开发者更好地掌握这一工具。 ... [详细]
  • 深入解析HTTP网络请求API:从基础到进阶的全面指南
    本文全面解析了HTTP网络请求API,从基础到进阶,详细介绍了Android平台上的两种原生API——HttpUrlConnection和HttpClient。这两种API通过对底层Socket的封装,提供了高效、灵活的网络通信功能。文章不仅涵盖了基本的使用方法,还深入探讨了性能优化、错误处理和安全性等方面的高级主题,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 在Android平台上,视频监控系统的优化与应用具有重要意义。尽管已有相关示例(如http:www.open-open.comlibviewopen1346400423609.html)展示了基本的监控功能实现,但若要提升系统的稳定性和性能,仍需进行深入研究和优化。本文探讨了如何通过改进算法、优化网络传输和增强用户界面来提高Android视频监控系统的整体效能,以满足更复杂的应用需求。 ... [详细]
  • C++ 开发实战:实用技巧与经验分享
    C++ 开发实战:实用技巧与经验分享 ... [详细]
  • Presto:高效即席查询引擎的深度解析与应用
    本文深入解析了Presto这一高效的即席查询引擎,详细探讨了其架构设计及其优缺点。Presto通过内存到内存的数据处理方式,显著提升了查询性能,相比传统的MapReduce查询,不仅减少了数据传输的延迟,还提高了查询的准确性和效率。然而,Presto在大规模数据处理和容错机制方面仍存在一定的局限性。本文还介绍了Presto在实际应用中的多种场景,展示了其在大数据分析领域的强大潜力。 ... [详细]
  • 在开发过程中,我最初也依赖于功能全面但操作繁琐的集成开发环境(IDE),如Borland Delphi 和 Microsoft Visual Studio。然而,随着对高效开发的追求,我逐渐转向了更加轻量级和灵活的工具组合。通过 CLIfe,我构建了一个高度定制化的开发环境,不仅提高了代码编写效率,还简化了项目管理流程。这一配置结合了多种强大的命令行工具和插件,使我在日常开发中能够更加得心应手。 ... [详细]
  • 在探讨 MySQL 正则表达式 REGEXP 的功能与应用之前,我们先通过一个小实验来对比 REGEXP 和 LIKE 的性能。通过具体的代码示例,我们将评估这两种查询方式的效率,以确定 REGEXP 是否值得深入研究。实验结果将为后续的详细解析提供基础。 ... [详细]
author-avatar
白白加黑黑99_889
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有