From 3055b6a9013dcfbbf49ecfc4ff2d3570985567cd Mon Sep 17 00:00:00 2001 From: hoyouly Date: Sat, 27 Feb 2016 22:20:55 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E9=87=8D=E6=96=B0=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E4=BA=86pickerview,=E4=BD=BF=E4=B9=8B=E6=97=A2=E8=83=BD?= =?UTF-8?q?=E6=A8=AA=E5=90=91=E6=BB=91=E5=8A=A8=EF=BC=8C=E5=8F=88=E8=83=BD?= =?UTF-8?q?=E7=BA=B5=E5=90=91=E6=BB=91=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/com/jingchen/timerpicker/PickerView.java | 719 ++++++++++--------- 1 file changed, 382 insertions(+), 337 deletions(-) diff --git a/src/com/jingchen/timerpicker/PickerView.java b/src/com/jingchen/timerpicker/PickerView.java index 79c8bb9..28f795d 100644 --- a/src/com/jingchen/timerpicker/PickerView.java +++ b/src/com/jingchen/timerpicker/PickerView.java @@ -1,10 +1,5 @@ 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; @@ -17,340 +12,390 @@ import android.view.MotionEvent; import android.view.View; +import java.util.ArrayList; +import java.util.List; +import java.util.Timer; +import java.util.TimerTask; + /** * 滚动选择器 更多详解见博客http://blog.csdn.net/zhongkejingwang/article/details/38513301 - * + * * @author chenjing - * */ -public class PickerView extends View -{ - - public static final String TAG = "PickerView"; - /** - * text之间间距和minTextSize之比 - */ - public static final float MARGIN_ALPHA = 2.8f; - /** - * 自动回滚到中间的速度 - */ - public static final float SPEED = 2; - - private List mDataList; - /** - * 选中的位置,这个位置是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 - // 这里mMoveLen / Math.abs(mMoveLen)是为了保有mMoveLen的正负号,以实现上滚或下滚 - mMoveLen = mMoveLen - mMoveLen / Math.abs(mMoveLen) * SPEED; - invalidate(); - } - - }; - - public PickerView(Context context) - { - super(context); - init(); - } - - public PickerView(Context context, AttributeSet attrs) - { - super(context, attrs); - init(); - } - - public void setOnSelectListener(onSelectListener listener) - { - mSelectListener = listener; - } - - private void performSelect() - { - if (mSelectListener != null) - mSelectListener.onSelect(mDataList.get(mCurrentSelected)); - } - - public void setData(List datas) - { - mDataList = datas; - mCurrentSelected = datas.size() / 2; - invalidate(); - } - - /** - * 选择选中的item的index - * - * @param selected - */ - public void setSelected(int selected) - { - mCurrentSelected = selected; - int distance = mDataList.size() / 2 - mCurrentSelected; - if (distance < 0) - for (int i = 0; i < -distance; i++) - { - moveHeadToTail(); - mCurrentSelected--; - } - else if (distance > 0) - for (int i = 0; i < distance; i++) - { - moveTailToHead(); - mCurrentSelected++; - } - invalidate(); - } - - /** - * 选择选中的内容 - * - * @param mSelectItem - */ - public void setSelected(String mSelectItem) - { - for (int i = 0; i < mDataList.size(); i++) - if (mDataList.get(i).equals(mSelectItem)) - { - setSelected(i); - break; - } - } - - private void moveHeadToTail() - { - String head = mDataList.get(0); - mDataList.remove(0); - mDataList.add(head); - } - - private void moveTailToHead() - { - String tail = mDataList.get(mDataList.size() - 1); - mDataList.remove(mDataList.size() - 1); - mDataList.add(0, tail); - } - - @Override - protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) - { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - mViewHeight = getMeasuredHeight(); - mViewWidth = getMeasuredWidth(); - // 按照View的高度计算字体大小 - mMaxTextSize = mViewHeight / 4.0f; - mMinTextSize = mMaxTextSize / 2f; - isInit = true; - invalidate(); - } - - private void init() - { - timer = new Timer(); - mDataList = new ArrayList(); - mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); - mPaint.setStyle(Style.FILL); - mPaint.setTextAlign(Align.CENTER); - mPaint.setColor(mColorText); - } - - @Override - protected void onDraw(Canvas canvas) - { - super.onDraw(canvas); - // 根据index绘制view - if (isInit) - drawData(canvas); - } - - private void drawData(Canvas canvas) - { - // 先绘制选中的text再往上往下绘制其余的text - float scale = parabola(mViewHeight / 4.0f, mMoveLen); - float size = (mMaxTextSize - mMinTextSize) * scale + mMinTextSize; - mPaint.setTextSize(size); - mPaint.setAlpha((int) ((mMaxTextAlpha - mMinTextAlpha) * scale + mMinTextAlpha)); - // text居中绘制,注意baseline的计算才能达到居中,y值是text中心坐标 - float x = (float) (mViewWidth / 2.0); - float y = (float) (mViewHeight / 2.0 + mMoveLen); - FontMetricsInt fmi = mPaint.getFontMetricsInt(); - float baseline = (float) (y - (fmi.bottom / 2.0 + fmi.top / 2.0)); - - canvas.drawText(mDataList.get(mCurrentSelected), x, baseline, mPaint); - // 绘制上方data - for (int i = 1; (mCurrentSelected - i) >= 0; i++) - { - drawOtherText(canvas, i, -1); - } - // 绘制下方data - for (int i = 1; (mCurrentSelected + i) < mDataList.size(); i++) - { - drawOtherText(canvas, i, 1); - } - - } - - /** - * @param canvas - * @param position - * 距离mCurrentSelected的差值 - * @param type - * 1表示向下绘制,-1表示向上绘制 - */ - private void drawOtherText(Canvas canvas, int position, int type) - { - float d = (float) (MARGIN_ALPHA * mMinTextSize * position + type - * mMoveLen); - float scale = parabola(mViewHeight / 4.0f, d); - float size = (mMaxTextSize - mMinTextSize) * scale + mMinTextSize; - mPaint.setTextSize(size); - mPaint.setAlpha((int) ((mMaxTextAlpha - mMinTextAlpha) * scale + mMinTextAlpha)); - float y = (float) (mViewHeight / 2.0 + type * d); - FontMetricsInt fmi = mPaint.getFontMetricsInt(); - float baseline = (float) (y - (fmi.bottom / 2.0 + fmi.top / 2.0)); - canvas.drawText(mDataList.get(mCurrentSelected + type * position), - (float) (mViewWidth / 2.0), baseline, mPaint); - } - - /** - * 抛物线 - * - * @param zero - * 零点坐标 - * @param x - * 偏移量 - * @return scale - */ - private float parabola(float zero, float x) - { - float f = (float) (1 - Math.pow(x / zero, 2)); - return f < 0 ? 0 : f; - } - - @Override - public boolean onTouchEvent(MotionEvent event) - { - switch (event.getActionMasked()) - { - case MotionEvent.ACTION_DOWN: - doDown(event); - break; - case MotionEvent.ACTION_MOVE: - doMove(event); - break; - case MotionEvent.ACTION_UP: - doUp(event); - break; - } - return true; - } - - private void doDown(MotionEvent event) - { - if (mTask != null) - { - mTask.cancel(); - mTask = null; - } - mLastDownY = event.getY(); - } - - private void doMove(MotionEvent event) - { - - mMoveLen += (event.getY() - mLastDownY); - - if (mMoveLen > MARGIN_ALPHA * mMinTextSize / 2) - { - // 往下滑超过离开距离 - moveTailToHead(); - mMoveLen = mMoveLen - MARGIN_ALPHA * mMinTextSize; - } else if (mMoveLen < -MARGIN_ALPHA * mMinTextSize / 2) - { - // 往上滑超过离开距离 - moveHeadToTail(); - mMoveLen = mMoveLen + MARGIN_ALPHA * mMinTextSize; - } - - mLastDownY = event.getY(); - invalidate(); - } - - private void doUp(MotionEvent event) - { - // 抬起手后mCurrentSelected的位置由当前位置move到中间选中位置 - if (Math.abs(mMoveLen) < 0.0001) - { - mMoveLen = 0; - return; - } - if (mTask != null) - { - mTask.cancel(); - mTask = null; - } - mTask = new MyTimerTask(updateHandler); - timer.schedule(mTask, 0, 10); - } - - class MyTimerTask extends TimerTask - { - Handler handler; - - public MyTimerTask(Handler handler) - { - this.handler = handler; - } - - @Override - public void run() - { - handler.sendMessage(handler.obtainMessage()); - } - - } - - public interface onSelectListener - { - void onSelect(String text); - } +public class PickerView extends View { + + public static final String TAG = "PickerView"; + /** + * text之间间距和minTextSize之比 + */ + public static final float MARGIN_ALPHA = 3.8f; + /** + * 自动回滚到中间的速度 + */ + public static final float SPEED = 2; + + private List mDataList; + /** + * 选中的位置,这个位置是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, mLastDownX; + /** + * 滑动的距离 + */ + private float mMoveLen = 0; + private float moveDistance = 0; + private boolean isInit = false; + private onSelectListener mSelectListener; + private Timer timer; + private MyTimerTask mTask; + + private boolean isHorizontal;//是否是横向 + private boolean isRepeat;//是否是循环滚动 + + private float zero;//零点坐标 + + private float x, y;//绘制文本时的起始位置 + private FontMetricsInt fmi; + private float offset;//偏移量 + private float scale;//刻度 + private float textSize;//绘制的字体大小 + + + 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 + // 这里mMoveLen / Math.abs(mMoveLen)是为了保有mMoveLen的正负号,以实现上滚或下滚 + mMoveLen = mMoveLen - mMoveLen / Math.abs(mMoveLen) * SPEED; + invalidate(); + } + + }; + + public PickerView(Context context) { + super(context); + init(); + } + + public PickerView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public void setOnSelectListener(onSelectListener listener) { + mSelectListener = listener; + } + + private void performSelect() { + if (mSelectListener != null) + mSelectListener.onSelect(mCurrentSelected); + } + + public void setData(List datas) { + mDataList = datas; + mCurrentSelected = datas.size() / 2; + invalidate(); + } + + /** + * 设置数据 + * @param datas 数据 + * @param currentSelectedValue 当前选中的值 + */ + public void setData(List datas, String currentSelectedValue) { + mDataList = datas; + mCurrentSelected = findIndexByValue(currentSelectedValue); + invalidate(); + } + + private int findIndexByValue(String value) { + for (int i = 0; i < mDataList.size(); i++) { + if (mDataList.get(i).equals(value)) { + return i; + } + } + return mDataList.size() / 2; + } + + /** + * 选择选中的item的index + * + * @param selected + */ + public void setSelected(int selected) { + mCurrentSelected = selected; + int distance = mDataList.size() / 2 - mCurrentSelected; + if (distance < 0) + for (int i = 0; i < -distance; i++) { + moveHeadToTail(); + mCurrentSelected--; + } + else if (distance > 0) + for (int i = 0; i < distance; i++) { + moveTailToHead(); + mCurrentSelected++; + } + invalidate(); + } + + public void setIsHorizontal(boolean isHorizontal) { + this.isHorizontal = isHorizontal; + } + + public void setIsRepeat(boolean isRepeat) { + this.isRepeat = isRepeat; + } + + /** + * 选择选中的内容 + * + * @param mSelectItem + */ + public void setSelected(String mSelectItem) { + for (int i = 0; i < mDataList.size(); i++) + if (mDataList.get(i).equals(mSelectItem)) { + setSelected(i); + break; + } + } + + private void moveHeadToTail() { + if (isRepeat) { + String head = mDataList.get(0); + mDataList.remove(0); + mDataList.add(head); + } else { + mCurrentSelected++; + if (mCurrentSelected >= mDataList.size()) { + mCurrentSelected = mDataList.size() - 1; + } + } + } + + private void moveTailToHead() { + if (isRepeat) { + String tail = mDataList.get(mDataList.size() - 1); + mDataList.remove(mDataList.size() - 1); + mDataList.add(0, tail); + } else { + mCurrentSelected--; + if (mCurrentSelected <= 0) { + mCurrentSelected = 0; + } + } + } + + @Override + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + mViewHeight = getMeasuredHeight(); + mViewWidth = getMeasuredWidth(); + + // 按照View的高度计算字体大小 +// if (isHorizontal) { +// mMaxTextSize = mViewHeight / 4.0f; +// mMinTextSize = mMaxTextSize / 2f; +// } else { +// mMaxTextSize = mViewHeight / 4.0f; +// mMinTextSize = mMaxTextSize / 2f; +// } + isInit = true; + invalidate(); + } + + private void init() { + timer = new Timer(); + mDataList = new ArrayList(); + mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); + mPaint.setStyle(Style.FILL); + mPaint.setTextAlign(Align.CENTER); + mPaint.setColor(mColorText); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + // 根据index绘制view + if (isInit && mCurrentSelected < mDataList.size()) { + //如果不加mCurrentSelected= 0; i++) { + drawOtherText(canvas, i, -1); + } + // 绘制下方data + for (int i = 1; (mCurrentSelected + i) < mDataList.size(); i++) { + drawOtherText(canvas, i, 1); + } + } + + private void drawSelectedText(Canvas canvas) { + scale = parabola(mMoveLen); + setPaint(); + calculateXY(mMoveLen); + canvas.drawText(mDataList.get(mCurrentSelected), x, y, mPaint); + } + + private void setPaint() { + textSize = (mMaxTextSize - mMinTextSize) * scale + mMinTextSize; + mPaint.setTextSize(textSize); + mPaint.setAlpha((int) ((mMaxTextAlpha - mMinTextAlpha) * scale + mMinTextAlpha)); + } + + /** + * @param canvas + * @param position 距离mCurrentSelected的差值 + * @param type 1表示向下绘制,-1表示向上绘制 + */ + private void drawOtherText(Canvas canvas, int position, int type) { + offset = (MARGIN_ALPHA * mMinTextSize * position + type * mMoveLen); + scale = parabola(offset); + setPaint(); + calculateXY(type * offset); + canvas.drawText(mDataList.get(mCurrentSelected + type * position), x, y, mPaint); + } + + private void calculateXY(float offset) { + // text居中绘制,注意baseline的计算才能达到居中,y值是text中心坐标 + if (isHorizontal) { + x = (float) (mViewWidth / 2.0 + offset); + y = (float) (mViewHeight / 2.0) + 25; + } else { + x = (float) (mViewWidth / 2.0); + y = (float) (mViewHeight / 2.0 + offset); + fmi = mPaint.getFontMetricsInt(); + y = (float) (y - (fmi.bottom / 2.0 + fmi.top / 2.0)); + } + } + + /** + * 抛物线 + * + * @param offset 偏移量 + * @return scale + */ + private float parabola(float offset) { + zero = (isHorizontal ? mViewWidth : mViewHeight) / 8.0f; + offset = (float) (1 - Math.pow(offset / zero, 2)); + return offset < 0 ? 0 : offset; + } + + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: + doDown(event); + break; + case MotionEvent.ACTION_MOVE: + doMove(event); + break; + case MotionEvent.ACTION_UP: + doUp(event); + break; + } + return true; + } + + private void doDown(MotionEvent event) { + if (mTask != null) { + mTask.cancel(); + mTask = null; + } + mLastDownY = event.getY(); + mLastDownX = event.getX(); + } + + private void doMove(MotionEvent event) { + if (isHorizontal) { + moveDistance = event.getX() - mLastDownX; + } else { + moveDistance = event.getY() - mLastDownY; + } + if (!isRepeat) {//不是重复的话,在滚动的两边的时候,就不在滚动,重新进行绘制了 + if (mCurrentSelected == 0 && moveDistance > 0) { + return; + } + if (moveDistance < 0 && mCurrentSelected == mDataList.size() - 1) { + return; + } + } + mMoveLen += moveDistance; + if (mMoveLen > MARGIN_ALPHA * mMinTextSize / 2) { + // 往右滑超过离开距离 + moveTailToHead(); + mMoveLen = mMoveLen - MARGIN_ALPHA * mMinTextSize; + } else if (mMoveLen < -MARGIN_ALPHA * mMinTextSize / 2) { + // 往左滑超过离开距离 + moveHeadToTail(); + mMoveLen = mMoveLen + MARGIN_ALPHA * mMinTextSize; + } + mLastDownX = event.getX(); + mLastDownY = event.getY(); + invalidate(); + } + + private void doUp(MotionEvent event) { + // 抬起手后mCurrentSelected的位置由当前位置move到中间选中位置 + if (Math.abs(mMoveLen) < 0.0001) { + mMoveLen = 0; + return; + } + if (mTask != null) { + mTask.cancel(); + mTask = null; + } + mTask = new MyTimerTask(updateHandler); + timer.schedule(mTask, 0, 10); + } + + class MyTimerTask extends TimerTask { + Handler handler; + + public MyTimerTask(Handler handler) { + this.handler = handler; + } + + @Override + public void run() { + handler.sendMessage(handler.obtainMessage()); + } + + } + + public interface onSelectListener { + void onSelect(int currentSelected); + } + + public String getCurrentValue() { + return mDataList.get(mCurrentSelected); + } } From ac043aabb1e395c32a80d5b44948e2b0bd523dd0 Mon Sep 17 00:00:00 2001 From: hoyouly Date: Sat, 27 Feb 2016 22:23:47 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E5=AE=8C=E5=96=84Demo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- res/layout/activity_main.xml | 119 ++++++++++- res/values/strings.xml | 23 +- .../jingchen/timerpicker/MainActivity.java | 200 ++++++++++++------ src/com/jingchen/timerpicker/UnitEmun.java | 66 ++++++ 4 files changed, 335 insertions(+), 73 deletions(-) create mode 100644 src/com/jingchen/timerpicker/UnitEmun.java diff --git a/res/layout/activity_main.xml b/res/layout/activity_main.xml index 9ec5f44..5bb3b71 100644 --- a/res/layout/activity_main.xml +++ b/res/layout/activity_main.xml @@ -1,18 +1,21 @@ + android:layout_width="match_parent" + android:layout_height="match_parent" + android:background="#000000"> + android:layout_centerHorizontal="true" + android:layout_marginTop="15dp" + android:background="#ffffff" + android:padding="15dp"> + android:layout_height="160dp"/> + android:textStyle="bold"/> + android:layout_toRightOf="@id/minute_tv"/> + android:textStyle="bold"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/res/values/strings.xml b/res/values/strings.xml index 4ffaa7d..3f30e62 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1,8 +1,29 @@ - + TimerPicker Settings Hello world! + 横向的选择器 + 纵向的选择器 + 循环: + + + + + + + + + + + + @string/gram + @string/bowl + @string/scoop + @string/granule + @string/minute + @string/second + diff --git a/src/com/jingchen/timerpicker/MainActivity.java b/src/com/jingchen/timerpicker/MainActivity.java index e89d956..4aad031 100644 --- a/src/com/jingchen/timerpicker/MainActivity.java +++ b/src/com/jingchen/timerpicker/MainActivity.java @@ -1,74 +1,152 @@ package com.jingchen.timerpicker; -import java.util.ArrayList; -import java.util.List; - import android.app.Activity; import android.os.Bundle; -import android.view.Menu; +import android.widget.RadioButton; +import android.widget.RadioGroup; import android.widget.Toast; -import com.jingchen.timerpicker.PickerView.onSelectListener; +import java.util.ArrayList; +import java.util.List; /** * 更多详解见博客http://blog.csdn.net/zhongkejingwang/article/details/38513301 - * + * * @author chenjing - * */ -public class MainActivity extends Activity -{ - - PickerView minute_pv; - PickerView second_pv; - - @Override - protected void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - minute_pv = (PickerView) findViewById(R.id.minute_pv); - second_pv = (PickerView) findViewById(R.id.second_pv); - List data = new ArrayList(); - List seconds = new ArrayList(); - for (int i = 0; i < 10; i++) - { - data.add("0" + i); - } - for (int i = 0; i < 60; i++) - { - seconds.add(i < 10 ? "0" + i : "" + i); - } - minute_pv.setData(data); - minute_pv.setOnSelectListener(new onSelectListener() - { - - @Override - public void onSelect(String text) - { - Toast.makeText(MainActivity.this, "选择了 " + text + " 分", - Toast.LENGTH_SHORT).show(); - } - }); - second_pv.setData(seconds); - second_pv.setOnSelectListener(new onSelectListener() - { - - @Override - public void onSelect(String text) - { - Toast.makeText(MainActivity.this, "选择了 " + text + " 秒", - Toast.LENGTH_SHORT).show(); - } - }); - minute_pv.setSelected(0); - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) - { - getMenuInflater().inflate(R.menu.main, menu); - return true; - } +public class MainActivity extends Activity implements RadioGroup.OnCheckedChangeListener { + + private PickerView minute_pv; + private PickerView second_pv; + + private PickerView value_pv;//值 + private PickerView unit_pv;//单位 + + private String currentValue, currentUnit; + + private RadioGroup vRepeat, hRepeat; + private RadioButton vpYes, hpYes, vpNo, hpNo; + private UnitEmun currentUnitEmun; + private List values, units; + + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + initView(); + showVerticalData(); + showHorizontalData(); + } + + private void showHorizontalData() { + values = new ArrayList(); + units = new ArrayList(); + String [] us=getResources().getStringArray(R.array.units); + for (int i=0;i data = new ArrayList(); + List seconds = new ArrayList(); + for (int i = 0; i < 10; i++) { + data.add("0" + i); + } + for (int i = 0; i < 60; i++) { + seconds.add(i < 10 ? "0" + i : "" + i); + } + minute_pv.setIsRepeat(true); + minute_pv.setIsHorizontal(false); + minute_pv.setData(data); + minute_pv.setOnSelectListener(new PickerView.onSelectListener() { + @Override + public void onSelect(int currentSelected) { + Toast.makeText(MainActivity.this, "选择了 " + minute_pv.getCurrentValue() + " 分", Toast.LENGTH_SHORT).show(); + } + }); + second_pv.setIsRepeat(true); + second_pv.setIsHorizontal(false); + second_pv.setData(seconds); + second_pv.setOnSelectListener(new PickerView.onSelectListener() { + @Override + public void onSelect(int currentSelected) { + Toast.makeText(MainActivity.this, "选择了 " + second_pv.getCurrentValue() + " 秒", Toast.LENGTH_SHORT).show(); + } + }); + minute_pv.setSelected(0); + } + + private void initView() { + minute_pv = (PickerView) findViewById(R.id.minute_pv); + second_pv = (PickerView) findViewById(R.id.second_pv); + value_pv = (PickerView) findViewById(R.id.pv_value); + unit_pv = (PickerView) findViewById(R.id.pv_unit); + + vRepeat = (RadioGroup) findViewById(R.id.rg_v_repeat); + hRepeat = (RadioGroup) findViewById(R.id.rg_h_repeat); + + vpYes = (RadioButton) findViewById(R.id.rb_v_yes); + hpYes = (RadioButton) findViewById(R.id.rb_h_yes); + vpNo = (RadioButton) findViewById(R.id.rb_v_no); + hpNo = (RadioButton) findViewById(R.id.rb_h_no); + + vRepeat.setOnCheckedChangeListener(this); + hRepeat.setOnCheckedChangeListener(this); + } + @Override + public void onCheckedChanged(RadioGroup radioGroup, int i) { + switch (i) { + case R.id.rb_v_yes://纵向重复 + minute_pv.setIsRepeat(true); + second_pv.setIsRepeat(true); + break; + case R.id.rb_v_no://纵向不重复 + minute_pv.setIsRepeat(false); + second_pv.setIsRepeat(false); + break; + case R.id.rb_h_yes://横向重复 + value_pv.setIsRepeat(true); + unit_pv.setIsRepeat(true); + break; + case R.id.rb_h_no://横向不重复 + value_pv.setIsRepeat(false); + unit_pv.setIsRepeat(false); + break; + } + } } diff --git a/src/com/jingchen/timerpicker/UnitEmun.java b/src/com/jingchen/timerpicker/UnitEmun.java new file mode 100644 index 0000000..c29fdea --- /dev/null +++ b/src/com/jingchen/timerpicker/UnitEmun.java @@ -0,0 +1,66 @@ +package com.jingchen.timerpicker; + +import android.content.Context; + +/** + * Created by hoyouly on 16/2/26. + */ +public enum UnitEmun { + UNIT_KE(0, R.string.gram, 10, 10, 20),//克 + UNIT_BOWL(1, R.string.bowl, 1, 1, 20),//碗 + UNIT_SCOOP(2, R.string.scoop, 1, 2, 20),//勺 + UNIT_MINUTE(3, R.string.minute, 1, 5, 20),//分 + UNIT_SECOND(4, R.string.second, 1, 60, 20),//秒 + UNIT_GRANULE(5, R.string.granule, 1, 1, 20);//粒 + + private int id; + private int nameResId;//单位的资源id + private int start;//起始位置 + private int increment;//单位间隔 + private int length;//长度 + + UnitEmun(int id, int nameResId, int start, int increment, int length) { + this.id = id; + this.nameResId = nameResId; + this.start = start; + this.increment = increment; + this.length = length; + } + + public int getLength() { + return length; + } + + public int getId() { + return id; + } + + public int getStart() { + return start; + } + + public int getIncrement() { + return increment; + } + + public int getNameResId() { + return nameResId; + } + + public static UnitEmun getUnitEmun(Context context, String name) { + if (context.getResources().getString(UNIT_KE.getNameResId()).equals(name)) { + return UNIT_KE; + } else if (context.getResources().getString(UNIT_BOWL.getNameResId()).equals(name)) { + return UNIT_BOWL; + } else if (context.getResources().getString(UNIT_SCOOP.getNameResId()).equals(name)) { + return UNIT_SCOOP; + } else if (context.getResources().getString(UNIT_GRANULE.getNameResId()).equals(name)) { + return UNIT_GRANULE; + } else if (context.getResources().getString(UNIT_MINUTE.getNameResId()).equals(name)) { + return UNIT_MINUTE; + } else if (context.getResources().getString(UNIT_SECOND.getNameResId()).equals(name)) { + return UNIT_SECOND; + } + return UNIT_BOWL; + } +} From 8ff0d02919a219cd914fbecf61a250be9c9ac07c Mon Sep 17 00:00:00 2001 From: hoyouly Date: Sat, 27 Feb 2016 22:41:01 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E6=94=B9UI=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- res/layout/activity_main.xml | 68 ++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 30 deletions(-) diff --git a/res/layout/activity_main.xml b/res/layout/activity_main.xml index 5bb3b71..1619a7b 100644 --- a/res/layout/activity_main.xml +++ b/res/layout/activity_main.xml @@ -12,43 +12,50 @@ android:background="#ffffff" android:padding="15dp"> - - - + android:layout_height="wrap_content"> + - + + + - + + + @@ -80,6 +87,7 @@ android:text="@string/no"/> +