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

项目需要,做一个可以调整字体大小的控件,能在滑动或点击时改变选中的位置,效果图如下:

这是一个类似于RatingBar的控件,然而配置RatingBar的样式难以实现这样的效果,如选中的图案和上面的文字对齐。因此,有必要写一个自定义View来实现。

思路如下:

  • 新建一个TextRatingBar继承View类
  • 在onDraw()方法中绘制元素:文字、横线、短竖线和圆形标记
  • 重写onMeasure()方法,控制整体大小和边界
  • 在onTouchEvent()方法中处理ACTION_DOWN和ACTION_MOVE事件,调用invalidate()方法引起View的重绘,以更新视图
  • 定义一个用户选中某个字体的回调接口,以通知外部处理,比如去设置字体大小。

TextRatingBar类代码如下:

package cc.rome753.demo.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

/**
 * Created by rome753 on 2017/3/10
 */

public class TextRatingBar extends View{

 //paddingLeft
 private int mLeft;
 //paddingTop
 private int mTop;
 //当前rating
 private int mRating;
 //总raring数
 private int mCount;
 //rating文字
 private String[] texts = {"小","中","大","超大"};
 //相邻raring的距离
 private int mUnitSize;
 //bar到底部的距离
 private int mYOffset;
 //小竖条的一半长度
 private int mMarkSize;

 Paint paint = new Paint();

 public TextRatingBar(Context context) {
  this(context, null);
 }

 public TextRatingBar(Context context, AttributeSet attrs) {
  this(context, attrs, 0);
 }

 public TextRatingBar(Context context, AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  mCount = 4;
  mRating = 0;
  mMarkSize = 3;
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  Log.i("test", getMeasuredWidth() + " " + getMeasuredHeight());
  mLeft = (getPaddingLeft()+getPaddingRight())/2;
  mTop = getPaddingTop();
  int barWidth = getMeasuredWidth() - 2 * mLeft;
  mUnitSize = barWidth/(mCount - 1);
  mYOffset = getMeasuredHeight() - getPaddingBottom();
 }

 @Override
 protected void onDraw(Canvas canvas) {
  paint.setStrokeWidth(2);
  paint.setColor(Color.RED);
  canvas.drawLine(mLeft,mYOffset,mLeft+mRating*mUnitSize,mYOffset,paint);
  for(int i=0;i<mCount;i++){
   paint.setColor(Color.RED);
   canvas.drawLine(mLeft+i*mUnitSize,mYOffset-mMarkSize,mLeft+i*mUnitSize,mYOffset+mMarkSize,paint);
   paint.setColor(mRating == i ? Color.RED : Color.BLACK);
   paint.setTextSize(30);
   paint.setTextAlign(Paint.Align.CENTER);
   canvas.drawText(texts[i],mLeft+i*mUnitSize,mTop,paint);
  }
  paint.setColor(Color.GRAY);
  canvas.drawLine(mLeft+mRating*mUnitSize,mYOffset,mLeft+(mCount-1)*mUnitSize,mYOffset,paint);
  canvas.drawCircle(mLeft+mRating*mUnitSize,mYOffset,10,paint);

 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  if(event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE){
   float x = event.getX();
   for(int i=0;i<mCount;i++){
    float distance = mLeft+i*mUnitSize - x;
    if(Math.abs(distance) < 100){
     setRating(i);
     if(onRatingListener != null){
      onRatingListener.onRating(mRating);
     }
     break;
    }
   }
  }
  return true;
 }

 public void setRating(int rating) {
  mRating = rating;
  invalidate();
 }

 private OnRatingListener onRatingListener;

 public void setOnRatingListener(OnRatingListener onRatingListener) {
  this.onRatingListener = onRatingListener;
 }

 interface OnRatingListener{
  void onRating(int rating);
 }
}

几个要点:

  • onDraw()中的绘制要注意周围的预留空间,防止最左边的字体只显示一半,或滑动条下面没有一点空白的预留空间,导致用户不好划。因此在计算每一个绘制坐标时额外加上这些。
  • 触摸事件是判断当前触摸点离哪个rating点最近,要加上左右临界值Math.abs(distance),用户点击或划动在distance范围内就算发生了onRating()事件。

没有用到自定义属性,使用时直接放到布局中,周围加上padding就行了。

 <cc.rome753.demo.view.TextRatingBar
  android:paddingTop="20dp"
  android:paddingLeft="40dp"
  android:paddingRight="40dp"
  android:paddingBottom="35dp"
  android:layout_width="match_parent"
  android:layout_height="70dp" />

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

(0)

相关推荐

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

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

  • 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控件之RatingBar自定义星级评分样式

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

  • 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星级评分条控件RatingBar使用详解

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

  • 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评分控件RatingBar使用实例解析

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

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

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

  • 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的样式难以实现这样的效果,如选中的图案和上面的文字对齐.因此,有必要写一个自定义View来实现. 思路如下: 新建一个TextRatingBar继承View类 在onDraw()方法中绘制元素:文字.横线.短竖线和圆形标记 重写onMeasure()方法,控制整体大小和边界 在onTouchEvent()方法中处理ACTION_DOWN和ACTI

  • 如何将Pycharm中调整字体大小的方式设置为"ctrl+鼠标滚轮上下滑"

      对于字体大小的调整,我们比较习惯的方式是ctrl+鼠标滚轮上下滑,这也是我们在大多数软件中对页面进行放大缩小的方式.但当我发现Pycharm中的字体偏小想要进行调整时,却发现使用ctrl+鼠标滚轮上下滑的方式没有反应.经过搜索查询发现,我们可以将Pycharm中的字体调整方式设置为ctrl+鼠标滚轮上下滑的方式,这是非常nice的!下面介绍一下设置过程,分为字体放大的设置与字体缩小的设置两个部分. Pycharm字体放大的设置    第一步:File → \rightarrow →Setti

  • android根据分辨率自动调整字体大小的实例代码

    手机设备太多,分辨率也不一样,看到网上大部分的适应字体的方法是定义values320×480或value-hdpi方式去处理.采用第一种的就惨了,很多设备的分辨率是不一样的,难道要每种都定义吗?采用第二种的在平板电脑里没有效果. 最后还是代码的方式方便快捷... [java] 复制代码 代码如下: //遍历设置字体  public static void changeViewSize(ViewGroup viewGroup,int screenWidth,int screenHeight) {/

  • python Matplotlib画图之调整字体大小的示例

    一张字体调整好的示例图: 字体大小就是 fontsize 参数 import matplotlib.pyplot as plt # 代码中的"..."代表省略的其他参数 ax = plt.subplot(111) # 设置刻度字体大小 plt.xticks(fontsize=20) plt.yticks(fontsize=20) # 设置坐标标签字体大小 ax.xlabel(..., fontsize=20) ax.ylabel(..., fontsize=20) # 设置图例字体大小

  • Android自定义控件打造闪闪发光字体

    介绍 在小米的开机动画和一些欢迎界面中, 我们经常看到这种闪闪发光的流光字体.看起来很炫酷,其实实现原理相当简单,我们只需要写自定义控件继承TextView,然后使用渲染器Gradient设置颜色渐变和Paint的setShadowLayer方法设置阴影,然后不断刷新改变位移即可. 实现 首先写一个shineTextView类继承自TextView. public class ShineTextView extends TextView { // 线性渐变渲染 private LinearGra

  • Android自定义控件实现带数值和动画的圆形进度条

    本文实例实现一个如下图所示的Android自定义控件,可以直观地展示某个球队在某个赛季的积分数和胜场.负场.平局数 首先对画布进行区域划分,整个控件分上下两部分 上边是个大的圆环,圆环中间两行文字,没什么难度,选好圆心坐标和半径后直接绘制即可,绘制文字也是如此. 下部分是三个小的圆弧进度条,弧的末端绘制一个小的实心圆 首先选好坐标和半径,然后先绘制三个圆环作为弧形进度条的背景 之后从12点钟开始绘制进度弧,知道了圆环的圆心和半径,也知道了弧对应于12点钟和圆环圆心的偏移角度 通过三角函数可以计算

  • Android如何动态调整应用字体大小详解

    前言 为什么要动态设置字体大小?由于项目面对的是中老年客户项目中自带的字体无法满足客户需求. Android应用字体大小默认随系统设置的字体大小而变化,但您可能不希望您的应用字体大小随系统设置变化,想要自己控制,例如微信.本文简单介绍一下如何实现应用字体大小动态调整而不是依赖系统设置 字体大小变化是由android.content.res.Configuration.class类中的fontScale控制的,因此,若想我们的应用字体大小变化不随系统变化而是由我们自主控制,就需要我们修改fontS

  • js简单实现调整网页字体大小的方法

    本文实例讲述了js简单实现调整网页字体大小的方法.分享给大家供大家参考,具体如下: //var tgs = new Array('div','td','tr'); var tgs = new Array('td','tr'); //Specify spectrum of different font sizes: //var szs = new Array( 'xx-small','x-small','small','medium','large','x-large','xx-large' );

  • Android编程实现自动调整TextView字体大小以适应文字长度的方法

    本文实例讲述了Android编程实现自动调整TextView字体大小以适应文字长度的方法.分享给大家供大家参考,具体如下: package com.test.android.textview; import android.content.Context; import android.graphics.Paint; import android.util.AttributeSet; import android.widget.TextView; public class CustomTextV

  • Android编程中TextView字体属性设置方法(大小、字体、下划线、背景色)

    本文实例讲述了Android编程中TextView字体属性设置方法(大小.字体.下划线.背景色).分享给大家供大家参考,具体如下: import android.content.Context; import android.graphics.Color; import android.text.SpannableString; import android.text.Spanned; import android.text.style.AbsoluteSizeSpan; import andr

随机推荐