android横向滑动选择年龄控件,android实现年龄段选择器

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

cbf0043e5649aa8ca93d9e0554684150.png

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

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中

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);

}

});

写完收工。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值