Android自定义控件实战——滚动选择器PickerView
Posted 竹山一叶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android自定义控件实战——滚动选择器PickerView相关的知识,希望对你有一定的参考价值。
转载请声明出处http://blog.csdn.net/zhongkejingwang/article/details/38513301
手机里设置闹钟需要选择时间,那个选择时间的控件就是滚动选择器,前几天用手机刷了MIUI,发现自带的那个时间选择器效果挺好看的,于是就自己仿写了一个,权当练手。先来看效果:
效果还行吧?实现思路就是自定义一个PickerView,单独滚动的是一个PickerView,显然上图中有分和秒的选择所以在布局里用了两个PickerView。由于这里不涉及到text的点击事件,所以只需要继承View就行了,直接把text用canvas画上去。PickerView的实现的主要难点:
难点1:
字体随距离的渐变。可以看到,text随离中心位置的距离变化而变化,这里变化的是透明度alpha和字体大小TexSize,这两个值我都设置了Max和Min值,通过其与中心点的距离计算scale。我用的是变化曲线是抛物线scale=1-ax^2(x<=Height/4),scale = 0(x>Height/4),a=(4/Height)^2。x就是距离View中心的偏移量。用图片表示如下:
难点2:
text的居中。绘制text的时候不仅要使其在x方向上居中,还要在y方向上居中,在x方向上比较简单,设置Paint的Align为Align.CENTER就行了,但是y方向上很蛋疼,需要计算text的baseline。
难点3:
循环滚动。为了解决循环滚动的问题我把存放text的List从中间往上下摊开,通过不断地moveHeadToTail和moveTailToHead使选中的text始终是list的中间position的值。
以上就是几个难点,了解了之后可以来看PickerView的代码了:
- package com.jingchen.timerpicker;
-
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Timer;
- import java.util.TimerTask;
-
- import android.content.Context;
- import android.graphics.Canvas;
- import android.graphics.Paint;
- import android.graphics.Paint.Align;
- import android.graphics.Paint.FontMetricsInt;
- import android.graphics.Paint.Style;
- import android.os.Handler;
- import android.os.Message;
- import android.util.AttributeSet;
- import android.view.MotionEvent;
- import android.view.View;
-
-
-
-
-
-
-
- public class PickerView extends View
- {
-
- public static final String TAG = "PickerView";
-
-
-
- public static final float MARGIN_ALPHA = 2.8f;
-
-
-
- public static final float SPEED = 2;
-
- private List<String> mDataList;
-
-
-
- private int mCurrentSelected;
- private Paint mPaint;
-
- private float mMaxTextSize = 80;
- private float mMinTextSize = 40;
-
- private float mMaxTextAlpha = 255;
- private float mMinTextAlpha = 120;
-
- private int mColorText = 0x333333;
-
- private int mViewHeight;
- private int mViewWidth;
-
- private float mLastDownY;
-
-
-
- private float mMoveLen = 0;
- private boolean isInit = false;
- private onSelectListener mSelectListener;
- private Timer timer;
- private MyTimerTask mTask;
-
- Handler updateHandler = new Handler()
- {
-
- @Override
- public void handleMessage(Message msg)
- {
- if (Math.abs(mMoveLen) < SPEED)
- {
- mMoveLen = 0;
- if (mTask != null)
- {
- mTask.cancel();
- mTask = null;
- performSelect();
- }
- } else
-
-  
以上是关于Android自定义控件实战——滚动选择器PickerView的主要内容,如果未能解决你的问题,请参考以下文章
Android自定义实现循环滚轮控件WheelView
Android的FixScrollView自定义控件
Android自定义控件
Android自定义View实战之自定义评价打分控件RatingBar,可以自定义星星大小和间距
我的新书《Android自定义控件入门与实战》出版啦
我的新书《Android自定义控件入门与实战》出版啦