android实现年龄段选择器

本文实例为大家分享了android实现年龄段选择器的具体代码,供大家参考,具体内容如下

效果就是滑动圆形按钮选择时间,废话不多说,先上工具类

import android.view.View;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;

import com.zhiziyun.dmptest.bot.R;

/**
 * Created by Administrator on 2018/7/27.
 */

public class RangeSeekBar extends View {
 private float lineWidth = 5.0f;
 private float textSize = 25.0f;

 private int inRangeColor = 0xff247ab7;
 private int outRangeColor = 0xff777777;
 private int textColor = 0xff247ab7;

 private int textMarginBottom = 10;

 private int lowerCenterX;
 private int upperCenterX;

 private int bmpWidth;
 private int bmpHeight;

 private Bitmap lowerBmp;
 private Bitmap upperBmp;

 private Paint inRangePaint;
 private Paint outRangePaint;
 private Paint bmpPaint;
 private Paint textPaint;

 private boolean isLowerMoving = false;
 private boolean isUpperMoving = false;

 private OnRangeChangedListener onRangeChangedListener;

 private int paddingLeft = 50;
 private int paddingRight = 50;
 private int paddingTop = 50;
 private int paddingBottom = 10;

 private int lineHeight;
 private int lineLength = 400;
 private int lineStart = paddingLeft;
 private int lineEnd = lineLength + paddingLeft;

 private float smallValue = 13.0f;//最小值
 private float bigValue = 60.0f;//最大值

 private float smallRange = smallValue;
 private float bigRange = bigValue;

 private int textHeight;

 public RangeSeekBar(Context context) {
  super(context);
  init();
 }

 public RangeSeekBar(Context context, AttributeSet attrs) {
  super(context, attrs);
  init();
 }

 public RangeSeekBar(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  init();
 }

 private void init() {
  lowerBmp = BitmapFactory.decodeResource(getResources(),
    R.drawable.circular);//圆形按钮图标,自己设置
  upperBmp = BitmapFactory.decodeResource(getResources(),
    R.drawable.circular);//圆形按钮图标,自己设置

  bmpWidth = upperBmp.getWidth();
  bmpHeight = upperBmp.getHeight();

  lowerCenterX = lineStart;
  upperCenterX = lineEnd;

  lineHeight = getHeight() - paddingBottom - lowerBmp.getHeight() / 2;
  textHeight = lineHeight + lowerBmp.getHeight() / 2 + 10;

 }

 private void initPaint() {
  // 绘制范围内的线条
  inRangePaint = new Paint();
  inRangePaint.setAntiAlias(true);
  inRangePaint.setStrokeWidth(lineWidth);
  inRangePaint.setColor(inRangeColor);

  // 绘制范围外的线条
  outRangePaint = new Paint();
  outRangePaint.setAntiAlias(true);
  outRangePaint.setStrokeWidth(lineWidth);
  outRangePaint.setColor(outRangeColor);

  // 画图片滑块
  bmpPaint = new Paint();

  // 画范围文字
  textPaint = new Paint();
  textPaint.setColor(textColor);
  textPaint.setTextSize(textSize);
  textPaint.setAntiAlias(true);
  textPaint.setStrokeWidth(lineWidth);
 }

 private int measureWidth(int measureSpec) {
  int result = 0;

  int specMode = MeasureSpec.getMode(measureSpec);
  int specSize = MeasureSpec.getSize(measureSpec);

  if (specMode == MeasureSpec.EXACTLY) {
   result = specSize;
  } else {
   result = paddingLeft + paddingRight + bmpWidth * 2;

   if (specMode == MeasureSpec.AT_MOST) {
    result = Math.min(result, specSize);
   }
  }

  return result;
 }

 private int measureHeight(int measureHeight) {
  int result = 0;

  int specMode = MeasureSpec.getMode(measureHeight);
  int specSize = MeasureSpec.getSize(measureHeight);

  if (specMode == MeasureSpec.EXACTLY) {
   result = bmpHeight * 2;
  } else {
   result = bmpHeight + paddingTop;

   if (specMode == MeasureSpec.AT_MOST) {
    result = Math.min(result, specSize);
   }
  }

  return result;
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  widthMeasureSpec = measureWidth(widthMeasureSpec);
  heightMeasureSpec = measureHeight(heightMeasureSpec);
  setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
 }

 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);

  bmpWidth = upperBmp.getWidth();
  bmpHeight = upperBmp.getHeight();

  lineHeight = getHeight() - paddingBottom - lowerBmp.getHeight() / 2;
  textHeight = lineHeight - bmpHeight / 2 - textMarginBottom;

  // 画线
  Paint linePaint = new Paint();
  linePaint.setAntiAlias(true);
  linePaint.setStrokeWidth(lineWidth);

  // 绘制处于图片滑块之间线段
  linePaint.setColor(inRangeColor);
  canvas.drawLine(lowerCenterX, lineHeight, upperCenterX, lineHeight,
    linePaint);

  // 绘制处于图片滑块两端的线段
  linePaint.setColor(outRangeColor);
  canvas.drawLine(lineStart, lineHeight, lowerCenterX, lineHeight,
    linePaint);
  canvas.drawLine(upperCenterX, lineHeight, lineEnd, lineHeight,
    linePaint);

  // 画图片滑块
  Paint bmpPaint = new Paint();
  canvas.drawBitmap(lowerBmp, lowerCenterX - bmpWidth / 2, lineHeight
    - bmpHeight / 2, bmpPaint);
  canvas.drawBitmap(lowerBmp, upperCenterX - bmpWidth / 2, lineHeight
    - bmpHeight / 2, bmpPaint);

  // 画范围文字
  Paint textPaint = new Paint();
  textPaint.setColor(textColor);
  textPaint.setTextSize(textSize);
  textPaint.setAntiAlias(true);
  textPaint.setStrokeWidth(lineWidth);
  canvas.drawText(String.format("%.0f岁", smallRange), lowerCenterX
    - bmpWidth / 2, textHeight, textPaint);
  canvas.drawText(String.format("%.0f岁", bigRange), upperCenterX
    - bmpWidth / 2, textHeight, textPaint);
 }

 @Override
 public boolean onTouchEvent(MotionEvent event) {
  super.onTouchEvent(event);

  float xPos = event.getX();
  switch (event.getAction()) {
   case MotionEvent.ACTION_DOWN:
    // 如果按下的位置在垂直方向没有与图片接触,则不会滑动滑块
    float yPos = event.getY();
    if (Math.abs(yPos - lineHeight) > bmpHeight / 2) {
     return false;
    }

    // 表示当前按下的滑块是左边的滑块
    if (Math.abs(xPos - lowerCenterX) < bmpWidth / 2) {
     isLowerMoving = true;
    }

    // //表示当前按下的滑块是右边的滑块
    if (Math.abs(xPos - upperCenterX) < bmpWidth / 2) {
     isUpperMoving = true;
    }

    // 单击左边滑块的左边线条时,左边滑块滑动到对应的位置
    if (xPos >= lineStart && xPos <= lowerCenterX - bmpWidth / 2) {
     lowerCenterX = (int) xPos;
     updateRange();
     postInvalidate();
    }

    // 单击右边滑块的右边线条时, 右边滑块滑动到对应的位置
    if (xPos <= lineEnd && xPos >= upperCenterX + bmpWidth / 2) {
     upperCenterX = (int) xPos;
     updateRange();
     postInvalidate();
    }
    break;
   case MotionEvent.ACTION_MOVE:
    // 滑动左边滑块时
    if (isLowerMoving) {
     if (xPos >= lineStart && xPos < upperCenterX - bmpWidth) {
      lowerCenterX = (int) xPos;
      updateRange();
      postInvalidate();
     }
    }

    // 滑动右边滑块时
    if (isUpperMoving) {
     if (xPos > lowerCenterX + bmpWidth && xPos < lineEnd) {
      upperCenterX = (int) xPos;
      updateRange();
      postInvalidate();
     }
    }

    break;
   case MotionEvent.ACTION_UP:
    // 修改滑块的滑动状态为不再滑动
    isLowerMoving = false;
    isUpperMoving = false;
    break;
   default:
    break;
  }

  return true;
 }

 // 计算指定滑块对应的范围值
 private float computRange(float range) {
  return (range - lineStart) * (bigValue - smallValue) / lineLength
    + smallValue;
 }

 // 滑动滑块的过程中,更新滑块上方的范围标识
 private void updateRange() {
  smallRange = computRange(lowerCenterX);
  bigRange = computRange(upperCenterX);

  if (null != onRangeChangedListener) {
   onRangeChangedListener.onRangeChanged(smallRange, bigRange);
  }
 }

 // 注册滑块范围值改变事件的监听
 public void setOnRangeChangedListener(
   OnRangeChangedListener onRangeChangedListener) {
  this.onRangeChangedListener = onRangeChangedListener;
 }

 // 公共接口,用户回调接口范围值的改变
 public interface OnRangeChangedListener {

  public void onRangeChanged(float lowerRange, float upperRange);

 }

}

在xml中

<com.zhiziyun.dmptest.bot.util.RangeSeekBar
    android:id="@+id/rangeSeekBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

最后在代码中调用

rangeSeekBar = (RangeSeekBar) findViewById(R.id.rangeSeekBar);

  rangeSeekBar.setOnRangeChangedListener(new RangeSeekBar.OnRangeChangedListener() {

   @Override
   public void onRangeChanged(float lowerRange, float upperRange) {
    tv_age.setText((int) lowerRange + "~" + (int) upperRange);
   }
  });

写完收工。

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

(0)

相关推荐

  • Android自定义可循环的滚动选择器CycleWheelView

    最近碰到个项目要使用到滚动选择器,原生的NumberPicker可定制性太差,不大符合UI要求. 网上开源的WheelView是用ScrollView写的,不能循环滚动,而且当数据量很大时要加载的Item太多,性能非常低. 然后,还是自己写一个比较靠谱,用的是ListView实现的.写完自己体验了一下,性能不错,再大的数据也不怕了. 感觉不错,重新封装了一下,提供了一些接口可以直接按照自己的需求定制,调用方法在MainActivity中. 补个图片: 不多说了,直接上代码: CycleWheel

  • Android仿微信照片选择器实现预览查看图片

    好了下面进入正题,我们先看一下实现效果吧: 下面来介绍一下代码: 本思路就是: 1.先到手机中扫描jpeg和png的图片 2.获取导图片的路径和图片的父路径名也就是文件夹名 3.将图片路径和文件夹名分别添加导数据源中 4.数据源有了就是显示了,文件夹显示是利用的popwindow,而图片显示则是GridView 看一下具体代码: 首先开启一个线程去扫描图片 /** * 利用ContentProvider扫描手机中的图片,此方法在运行在子线程中 完成图片的扫描,最终获得jpg最多的那个文件夹 */

  • 浅谈谈Android 图片选择器

    ImageSelector 简介 Android自定义相册,实现了拍照.图片选择(单选/多选).ImageLoader无绑定 任由开发者选择 https://github.com/YancyYe/ImageSelector Demo Download Apk 更新内容 UI重改 所有功能可配置 解决OOM情况 图片手动选择 支持汉语和英语 截图展示 使用说明 步骤一: 通过Gradle抓取 dependencies { compile 'com.yancy.imageselector:image

  • Android开发中实现IOS风格底部选择器(支持时间 日期 自定义)

    本文Github代码链接 https://github.com/AndroidMsky/AndoirdIOSPicker 先上图吧: 这是笔者最近一个项目一直再用的一个选择器库,自己也在其中做了修改,并决定持续维护下去. 先看使用方法: 日期选择: private void showDateDialog(List<Integer> date) { DatePickerDialog.Builder builder = new DatePickerDialog.Builder(this); bui

  • android 字体颜色选择器(ColorPicker)介绍

    primary_text_yellow.xml 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <!-- Copyright (C) 2008 The Android Open Source Project Licensed under the Apache License, Version 2.0 (the "License"); you may not use this f

  • Android中颜色选择器和改变字体颜色的实例教程

    1.构建一张七彩图: 我们经常看到这种样子的颜色选择器吧.. 然后其实右边的亮度选择是: 这样我们的代码就可以进行啦... // 创建七彩图片 private void init() { int[] oc = { 0xffff0000, 0xffffff00, 0xff00ff00, 0xff00ffff, 0xff0000ff, 0xffff00ff, 0xffff0000 }; float[] op = { 0, 0.16667f, 0.33333f, 0.5f, 0.66667f, 0.8

  • Android selector背景选择器的使用详解

    在开发应用中,很多情况下要设计listview或button控件的背景,下面总结一下android的selector的用法:1.在drawable中配置Android的selector.将如下的XML文件保存成你自己命名的.xml文件(比如item_bg.xml),并将该文件放置在drawable文件中,在系统使用时根据ListView中的列表项的状态来使用相应的背景图片. 复制代码 代码如下: <?xml version="1.0" encoding="utf-8&q

  • Android PickerView滚动选择器的使用方法

    手机里设置闹钟需要选择时间,那个选择时间的控件就是滚动选择器,前几天用手机刷了MIUI,发现自带的那个时间选择器效果挺好看的,于是就自己仿写了一个,权当练手.先来看效果: 效果还行吧?实现思路就是自定义一个PickerView,单独滚动的是一个PickerView,显然上图中有分和秒的选择所以在布局里用了两个PickerView.由于这里不涉及到text的点击事件,所以只需要继承View就行了,直接把text用canvas画上去.PickerView的实现的主要难点: 难点1: 字体随距离的渐变

  • Android时间选择器、日期选择器实现代码

    本文为大家分享了两款选择器,一款可以针对时间进行选择.一款可以针对日期进行选择,供大家参考,具体内容如下 一.时间选择器 1.1.布局 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.and

  • 基于android背景选择器selector的用法汇总

    一.创建xml文件,位置:drawable/xxx.xml,同目录下记得要放相关图片 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android">    <!-- 没有焦点时的背景图片 -->    <item android:dr

随机推荐