前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >android自定义滚轴选择器

android自定义滚轴选择器

作者头像
砸漏
发布2020-10-19 11:27:34
1.1K0
发布2020-10-19 11:27:34
举报
文章被收录于专栏:恩蓝脚本恩蓝脚本

本文实例为大家分享了android自定义滚轴选择器的具体代码,供大家参考,具体内容如下

效果图:

点击选择餐具弹出底部弹窗

代码语言:javascript
复制
 private Dialog dialog;
 private View inflate;
 PickValueView pickString;

case R.id.rl_cj_num://餐具数量选择
  //选择对话框
  dialog = new Dialog(this, R.style.ActionSheetDialogStyle);
  View contentView = LayoutInflater.from(this).inflate(R.layout.dialog_cj_num, null);
  //获取组件
  tv_cancel = contentView.findViewById(R.id.tv_cancel);
  pickString = contentView.findViewById(R.id.pickString);
  //获取Dialog的监听
  tv_cancel.setOnClickListener(this);
  pickString.setOnSelectedChangeListener(this);
  String[] valueStr = new String[]{"无需餐具", "1人", "2人", "3人", "4人", "5人",
   "6人", "7人", "8人"};
  pickString.setValueData(valueStr, valueStr[1]);
  dialog.setContentView(contentView);
  ViewGroup.LayoutParams layoutParams = contentView.getLayoutParams();
  layoutParams.width = getResources().getDisplayMetrics().widthPixels;
  contentView.setLayoutParams(layoutParams);
  dialog.getWindow().setGravity(Gravity.BOTTOM);//弹窗位置
  dialog.getWindow().setWindowAnimations(R.style.ActionSheetDialogStyle);//弹窗样式
  dialog.show();//显示弹窗
  break;

styles.xml中的样式:

代码语言:javascript
复制
 <!-- Dialog弹窗效果-- 
 <style name="ActionSheetDialogStyle" parent="@android:style/Theme.Dialog" 
 <!-- 背景透明 -- 
 <item name="android:windowBackground" @android:color/transparent</item 
 <item name="android:windowContentOverlay" @null</item 
 <!-- 浮于Activity之上 -- 
 <item name="android:windowIsFloating" true</item 
 <!-- 边框 -- 
 <item name="android:windowFrame" @null</item 
 <!-- Dialog以外的区域模糊效果 -- 
 <item name="android:backgroundDimEnabled" true</item 
 <!-- 无标题 -- 
 <item name="android:windowNoTitle" true</item 
 <!-- 半透明 -- 
 <item name="android:windowIsTranslucent" true</item 
 <!-- Dialog进入及退出动画 -- 
 <item name="android:windowAnimationStyle" @style/ActionSheetDialogAnimation</item 
 </style 
 <!-- ActionSheet进出动画 -- 
 <style name="ActionSheetDialogAnimation" parent="@android:style/Animation.Dialog" 
 <item name="android:windowEnterAnimation" @anim/actionsheet_dialog_in</item 
 <item name="android:windowExitAnimation" @anim/actionsheet_dialog_out</item 
 </style 
 
 <style name="SplashTheme" parent="AppTheme" 
 <!-- 这里的trans自己写一个#00000000即可-- 
 <item name="android:windowBackground" @drawable/layer_splash</item 
 <item name="windowNoTitle" true</item 
 <item name="android:windowFullscreen" true</item 
 </style 

弹入弹出动画效果:

anim下新建:弹入资源文件actionsheet_dialog_in和弹出资源文件actionsheet_dialog_out

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"? 
<translate xmlns:android="http://schemas.android.com/apk/res/android"
 android:duration="200"
 android:fromYDelta="100%"
 android:toYDelta="0" / 
<?xml version="1.0" encoding="utf-8"? 
<translate xmlns:android="http://schemas.android.com/apk/res/android"
 android:duration="200"
 android:fromYDelta="0"
 android:toYDelta="100%" / 

自定义弹窗布局dialog_cj_num:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"? 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#f9f9f9"
 android:orientation="vertical" 
 
 <TextView
 android:layout_width="match_parent"
 android:layout_height="40dp"
 android:gravity="center"
 android:text="餐具选择"
 android:textColor="#333333"
 android:textSize="16sp" / 
 
 <View
 android:layout_width="match_parent"
 android:layout_height="1dp"
 android:background="#E8E8E8" / 
 
 <com.shanjing.mymeishi.View.PickValueView
 android:id="@+id/pickString"
 android:layout_width="match_parent"
 android:layout_height="wrap_content" / 
 
 <View
 android:layout_width="match_parent"
 android:layout_height="1dp"
 android:background="#E8E8E8" / 
 
 <TextView
 android:id="@+id/tv_cancel"
 android:layout_width="match_parent"
 android:layout_height="40dp"
 android:gravity="center"
 android:text="取消"
 android:textColor="#333333"
 android:textSize="16sp" / 
</LinearLayout 

自定义视图PickValueView和引用类MyNumberPicker:

代码语言:javascript
复制
package com.shanjing.mymeishi.View;
import android.content.Context;
import android.graphics.Color;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.NumberPicker;
import android.widget.TextView;
/**
* 选择日期视图
*/
public class PickValueView extends LinearLayout implements NumberPicker.OnValueChangeListener {
private Context mContext;
/**
* 组件 标题、单位、滚轮
*/
private TextView mTitleLeft, mTitleMiddle, mTitleRight;
private TextView mUnitLeft, mUnitMiddle, mUnitRight;
private MyNumberPicker mNpLeft, mNpMiddle, mNpRight;
/**
* 数据个数 1列 or 2列 or 3列
*/
private int mViewCount = 1;
/**
* 一组数据长度
*/
private final int DATA_SIZE = 3;
/**
* 需要设置的值与默认值
*/
private Object[] mLeftValues;
private Object[] mMiddleValues;
private Object[] mRightValues;
private Object mDefaultLeftValue;
private Object mDefaultMiddleValue;
private Object mDefaultRightValue;
/**
* 当前正在显示的值
*/
private Object[] mShowingLeft = new Object[DATA_SIZE];
private Object[] mShowingMiddle = new Object[DATA_SIZE];
private Object[] mShowingRight = new Object[DATA_SIZE];
/**
* 步长
*/
private int mLeftStep = 5;
private int mMiddleStep = 1;
private int mRightStep = 1;
/**
* 回调接口对象
*/
private onSelectedChangeListener mSelectedChangeListener;
public PickValueView(Context context) {
super(context);
this.mContext = context;
generateView();
}
public PickValueView(Context context, AttributeSet attrs) {
super(context, attrs);
this.mContext = context;
generateView();
}
public PickValueView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
generateView();
}
/**
* 生成视图
*/
private void generateView() {
//标题
LinearLayout titleLayout = new LinearLayout(mContext);
LayoutParams titleParams = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
titleParams.setMargins(0, 0, 0, dip2px(12));
titleLayout.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
titleLayout.setOrientation(HORIZONTAL);
mTitleLeft = new TextView(mContext);
mTitleMiddle = new TextView(mContext);
mTitleRight = new TextView(mContext);
LayoutParams params = new LayoutParams(0, ViewGroup.LayoutParams.WRAP_CONTENT, 1);
TextView[] titles = new TextView[]{mTitleLeft, mTitleMiddle, mTitleRight};
for (int i = 0; i < titles.length; i++) {
titles[i].setLayoutParams(params);
titles[i].setGravity(Gravity.CENTER);
titles[i].setTextColor(Color.parseColor("#000000"));
titles[i].setTextSize(12);
}
titleLayout.addView(mTitleLeft);
titleLayout.addView(mTitleMiddle);
titleLayout.addView(mTitleRight);
//内容
LinearLayout contentLayout = new LinearLayout(mContext);
contentLayout.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
contentLayout.setOrientation(HORIZONTAL);
contentLayout.setGravity(Gravity.CENTER);
mNpLeft = new MyNumberPicker(mContext);
mNpMiddle = new MyNumberPicker(mContext);
mNpRight = new MyNumberPicker(mContext);
mUnitLeft = new TextView(mContext);
mUnitMiddle = new TextView(mContext);
mUnitRight = new TextView(mContext);
MyNumberPicker[] nps = new MyNumberPicker[]{mNpLeft, mNpMiddle, mNpRight};
for (int i = 0; i < nps.length; i++) {
nps[i].setLayoutParams(params);
nps[i].setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS);
nps[i].setOnValueChangedListener(this);
}
contentLayout.addView(mNpLeft);
contentLayout.addView(mUnitLeft);
contentLayout.addView(mNpMiddle);
contentLayout.addView(mUnitMiddle);
contentLayout.addView(mNpRight);
contentLayout.addView(mUnitRight);
this.setLayoutParams(new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT));
this.setOrientation(VERTICAL);
this.addView(titleLayout);
this.addView(contentLayout);
}
/**
* 初始化数据和值
*/
private void initViewAndPicker() {
if (mViewCount == 1) {
this.mNpMiddle.setVisibility(GONE);
this.mNpRight.setVisibility(GONE);
this.mUnitMiddle.setVisibility(GONE);
this.mUnitRight.setVisibility(GONE);
} else if (mViewCount == 2) {
this.mNpRight.setVisibility(GONE);
this.mUnitRight.setVisibility(GONE);
}
//初始化数组值
if (mLeftValues != null && mLeftValues.length != 0) {
if (mLeftValues.length < DATA_SIZE) {
for (int i = 0; i < mLeftValues.length; i++) {
mShowingLeft[i] = mLeftValues[i];
}
for (int i = mLeftValues.length; i < DATA_SIZE; i++) {
mShowingLeft[i] = -9999;
}
} else {
for (int i = 0; i < DATA_SIZE; i++) {
mShowingLeft[i] = mLeftValues[i];
}
}
mNpLeft.setMinValue(0);
mNpLeft.setMaxValue(DATA_SIZE - 1);
if (mDefaultLeftValue != null)
updateLeftView(mDefaultLeftValue);
else
updateLeftView(mShowingLeft[0]);
}
/**
* 中间控件
*/
if (mViewCount == 2 || mViewCount == 3) {
if (mMiddleValues != null && mMiddleValues.length != 0) {
if (mMiddleValues.length < DATA_SIZE) {
for (int i = 0; i < mMiddleValues.length; i++) {
mShowingMiddle[i] = mMiddleValues[i];
}
for (int i = mMiddleValues.length; i < DATA_SIZE; i++) {
mShowingMiddle[i] = -9999;
}
} else {
for (int i = 0; i < DATA_SIZE; i++) {
mShowingMiddle[i] = mMiddleValues[i];
}
}
mNpMiddle.setMinValue(0);
mNpMiddle.setMaxValue(DATA_SIZE - 1);
if (mDefaultMiddleValue != null)
updateMiddleView(mDefaultMiddleValue);
else
updateMiddleView(mShowingMiddle[0]);
}
}
/**
* 右侧控件
*/
if (mViewCount == 3) {
if (mRightValues != null && mRightValues.length != 0) {
if (mRightValues.length < DATA_SIZE) {
for (int i = 0; i < mRightValues.length; i++) {
mShowingRight[i] = mRightValues[i];
}
for (int i = mRightValues.length; i < DATA_SIZE; i++) {
mShowingRight[i] = -9999;
}
} else {
for (int i = 0; i < DATA_SIZE; i++) {
mShowingRight[i] = mRightValues[i];
}
}
mNpRight.setMinValue(0);
mNpRight.setMaxValue(DATA_SIZE - 1);
if (mDefaultRightValue != null)
updateRightView(mDefaultRightValue);
else
updateRightView(mShowingRight[0]);
}
}
}
private void updateLeftView(Object value) {
updateValue(value, 0);
}
private void updateMiddleView(Object value) {
updateValue(value, 1);
}
private void updateRightView(Object value) {
updateValue(value, 2);
}
/**
* 更新滚轮视图
*
* @param value
* @param index
*/
private void updateValue(Object value, int index) {
String showStr[] = new String[DATA_SIZE];
MyNumberPicker picker;
Object[] showingValue;
Object[] values;
int step;
if (index == 0) {
picker = mNpLeft;
showingValue = mShowingLeft;
values = mLeftValues;
step = mLeftStep;
} else if (index == 1) {
picker = mNpMiddle;
showingValue = mShowingMiddle;
values = mMiddleValues;
step = mMiddleStep;
} else {
picker = mNpRight;
showingValue = mShowingRight;
values = mRightValues;
step = mRightStep;
}
if (values instanceof Integer[]) {
for (int i = 0; i < DATA_SIZE; i++) {
showingValue[i] = (int) value - step * (DATA_SIZE / 2 - i);
int offset = (int) values[values.length - 1] - (int) values[0] + step;
if ((int) showingValue[i] < (int) values[0]) {
showingValue[i] = (int) showingValue[i] + offset;
}
if ((int) showingValue[i]   (int) values[values.length - 1]) {
showingValue[i] = (int) showingValue[i] - offset;
}
showStr[i] = "" + showingValue[i];
}
} else {
int strIndex = 0;
for (int i = 0; i < values.length; i++) {
if (values[i].equals(value)) {
strIndex = i;
break;
}
}
for (int i = 0; i < DATA_SIZE; i++) {
int temp = strIndex - (DATA_SIZE / 2 - i);
if (temp < 0) {
temp += values.length;
}
if (temp  = values.length) {
temp -= values.length;
}
showingValue[i] = values[temp];
showStr[i] = (String) values[temp];
}
}
picker.setDisplayedValues(showStr);
picker.setValue(DATA_SIZE / 2);
picker.postInvalidate();
}
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
if (picker == mNpLeft) {
updateLeftView(mShowingLeft[newVal]);
} else if (picker == mNpMiddle) {
updateMiddleView(mShowingMiddle[newVal]);
} else if (picker == mNpRight) {
updateRightView(mShowingRight[newVal]);
}
if (mSelectedChangeListener != null) {
mSelectedChangeListener.onSelected(this, mShowingLeft[DATA_SIZE / 2], mShowingMiddle[DATA_SIZE / 2], mShowingRight[DATA_SIZE / 2]);
}
}
/**
* 设置数据--单列数据
*
* @param leftValues
* @param mDefaultLeftValue
*/
public void setValueData(Object[] leftValues, Object mDefaultLeftValue) {
this.mViewCount = 1;
this.mLeftValues = leftValues;
this.mDefaultLeftValue = mDefaultLeftValue;
initViewAndPicker();
}
/**
* 设置数据--两列数据
*
* @param leftValues
* @param mDefaultLeftValue
* @param middleValues
* @param defaultMiddleValue
*/
public void setValueData(Object[] leftValues, Object mDefaultLeftValue, Object[] middleValues, Object defaultMiddleValue) {
this.mViewCount = 2;
this.mLeftValues = leftValues;
this.mDefaultLeftValue = mDefaultLeftValue;
this.mMiddleValues = middleValues;
this.mDefaultMiddleValue = defaultMiddleValue;
initViewAndPicker();
}
/**
* 设置数据--三列数据
*
* @param leftValues
* @param mDefaultLeftValue
* @param middleValues
* @param defaultMiddleValue
* @param rightValues
* @param defaultRightValue
*/
public void setValueData(Object[] leftValues, Object mDefaultLeftValue, Object[] middleValues, Object defaultMiddleValue, Object[] rightValues, Object defaultRightValue) {
this.mViewCount = 3;
this.mLeftValues = leftValues;
this.mDefaultLeftValue = mDefaultLeftValue;
this.mMiddleValues = middleValues;
this.mDefaultMiddleValue = defaultMiddleValue;
this.mRightValues = rightValues;
this.mDefaultRightValue = defaultRightValue;
initViewAndPicker();
}
/**
* 设置左边数据步长
*
* @param step
*/
public void setLeftStep(int step) {
this.mLeftStep = step;
initViewAndPicker();
}
/**
* 设置中间数据步长
*
* @param step
*/
public void setMiddleStep(int step) {
this.mMiddleStep = step;
initViewAndPicker();
}
/**
* 设置右边数据步长
*
* @param step
*/
public void setRightStep(int step) {
this.mRightStep = step;
initViewAndPicker();
}
/**
* 设置标题
*
* @param left
* @param middle
* @param right
*/
public void setTitle(String left, String middle, String right) {
if (left != null) {
mTitleLeft.setVisibility(VISIBLE);
mTitleLeft.setText(left);
} else {
mTitleLeft.setVisibility(GONE);
}
if (middle != null) {
mTitleMiddle.setVisibility(VISIBLE);
mTitleMiddle.setText(middle);
} else {
mTitleMiddle.setVisibility(GONE);
}
if (right != null) {
mTitleRight.setVisibility(VISIBLE);
mTitleRight.setText(right);
} else {
mTitleRight.setVisibility(GONE);
}
this.postInvalidate();
}
public void setUnitLeft(String unitLeft) {
setUnit(unitLeft, 0);
}
public void setmUnitMiddle(String unitMiddle) {
setUnit(unitMiddle, 1);
}
public void setUnitRight(String unitRight) {
setUnit(unitRight, 2);
}
private void setUnit(String unit, int index) {
TextView tvUnit;
if (index == 0) {
tvUnit = mUnitLeft;
} else if (index == 1) {
tvUnit = mUnitMiddle;
} else {
tvUnit = mUnitRight;
}
if (unit != null) {
tvUnit.setText(unit);
} else {
tvUnit.setText(" ");
}
initViewAndPicker();
}
/**
* 设置回调
*
* @param listener
*/
public void setOnSelectedChangeListener(onSelectedChangeListener listener) {
this.mSelectedChangeListener = listener;
}
/**
* dp转px
*
* @param dp
* @return
*/
private int dip2px(int dp) {
float scale = mContext.getResources().getDisplayMetrics().density;
return (int) (scale * dp + 0.5f);
}
/**
* 回调接口
*/
public interface onSelectedChangeListener {
void onSelected(PickValueView view, Object leftValue, Object middleValue, Object rightValue);
}
}
代码语言:javascript
复制
package com.shanjing.mymeishi.View;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.SparseArray;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.NumberPicker;
import java.lang.reflect.Field;
public class MyNumberPicker extends NumberPicker {
private Context mContext;
NumberPicker picker;
public MyNumberPicker(Context context) {
super(context);
picker = this;
mContext = context;
}
public MyNumberPicker(Context context, AttributeSet attrs) {
super(context, attrs);
picker = this;
mContext = context;
}
public MyNumberPicker(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
picker = this;
mContext = context;
}
@Override
public void addView(View child) {
super.addView(child);
updateView(child);
}
@Override
public void addView(View child, int index, ViewGroup.LayoutParams params) {
super.addView(child, index, params);
updateView(child);
}
@Override
public void addView(View child, ViewGroup.LayoutParams params) {
super.addView(child, params);
updateView(child);
}
private void updateView(View view) {
if (view instanceof EditText) {
((EditText) view).setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
((EditText) view).setTextColor(Color.parseColor("#000000"));//进入时滚轴显示颜色
}
}
private int mRight, mLeft, mBottom;
private int mTopSelectionDividerTop;
private int mBottomSelectionDividerBottom;
private int[] mSelectorIndices;
private int mScrollState;
private SparseArray<String  mSelectorIndexToStringCache;
private EditText mInputText;
private Paint mSelectorWheelPaint;
private int mSelectorElementHeight;
private int mCurrentScrollOffset;
private boolean mHasSelectorWheel;
private boolean mHideWheelUntilFocused;
private Drawable mSelectionDivider;
/**
* 通过反射获取值
*/
private void getMyValue() {
mLeft = super.getLeft();
mRight = super.getRight();
mBottom = super.getBottom();
Field[] pickerFields = NumberPicker.class.getDeclaredFields();
for (Field field : pickerFields) {
field.setAccessible(true);
if (field.getName().equals("mSelectorWheelPaint")) {
try {
mSelectorWheelPaint = (Paint) field.get(picker);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
for (Field field : pickerFields) {
field.setAccessible(true);
if (field.getName().equals("mSelectorElementHeight")) {
try {
mSelectorElementHeight = (int) field.get(picker);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
for (Field field : pickerFields) {
field.setAccessible(true);
if (field.getName().equals("mCurrentScrollOffset")) {
try {
mCurrentScrollOffset = (int) field.get(picker);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
for (Field field : pickerFields) {
field.setAccessible(true);
if (field.getName().equals("mInputText")) {
try {
mInputText = (EditText) field.get(picker);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
for (Field field : pickerFields) {
field.setAccessible(true);
if (field.getName().equals("mSelectorIndexToStringCache")) {
try {
mSelectorIndexToStringCache = (SparseArray<String ) field.get(picker);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
for (Field field : pickerFields) {
field.setAccessible(true);
if (field.getName().equals("mSelectorIndices")) {
try {
mSelectorIndices = (int[]) field.get(picker);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
for (Field field : pickerFields) {
field.setAccessible(true);
if (field.getName().equals("mHasSelectorWheel")) {
try {
mHasSelectorWheel = (boolean) field.get(picker);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
for (Field field : pickerFields) {
field.setAccessible(true);
if (field.getName().equals("mHideWheelUntilFocused")) {
try {
mHideWheelUntilFocused = (boolean) field.get(picker);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
// for (Field field : pickerFields) {
//  field.setAccessible(true);
//  if (field.getName().equals("mDecrementVirtualButtonPressed")) {
//  try {
//   mDecrementVirtualButtonPressed = (boolean) field.get(picker);
//  } catch (IllegalAccessException e) {
//   e.printStackTrace();
//  }
//  break;
//  }
// }
// for (Field field : pickerFields) {
//  field.setAccessible(true);
//  if (field.getName().equals("mIncrementVirtualButtonPressed")) {
//  try {
//   mIncrementVirtualButtonPressed = (boolean) field.get(picker);
//  } catch (IllegalAccessException e) {
//   e.printStackTrace();
//  }
//  break;
//  }
// }
// for (Field field : pickerFields) {
//  field.setAccessible(true);
//  if (field.getName().equals("mVirtualButtonPressedDrawable")) {
//  try {
//   mVirtualButtonPressedDrawable = (Drawable) field.get(picker);
//  } catch (IllegalAccessException e) {
//   e.printStackTrace();
//  }
//  break;
//  }
// }
for (Field field : pickerFields) {
field.setAccessible(true);
if (field.getName().equals("mScrollState")) {
try {
mScrollState = (int) field.get(picker);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
for (Field field : pickerFields) {
field.setAccessible(true);
if (field.getName().equals("mTopSelectionDividerTop")) {
try {
mTopSelectionDividerTop = (int) field.get(picker);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
for (Field field : pickerFields) {
field.setAccessible(true);
if (field.getName().equals("mBottomSelectionDividerBottom")) {
try {
mBottomSelectionDividerBottom = (int) field.get(picker);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
for (Field field : pickerFields) {
field.setAccessible(true);
if (field.getName().equals("mSelectionDivider")) {
try {
mSelectionDivider = (Drawable) field.get(picker);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
break;
}
}
}
@Override
protected void onDraw(Canvas canvas) {
// super.onDraw(canvas);
getMyValue();
mSelectorWheelPaint.setColor(Color.BLUE);
if (!mHasSelectorWheel) {
super.onDraw(canvas);
return;
}
final boolean showSelectorWheel = mHideWheelUntilFocused ? hasFocus() : true;
float x = (mRight - mLeft) / 2;
float y = mCurrentScrollOffset;
// if (showSelectorWheel && mVirtualButtonPressedDrawable != null
//  && mScrollState == OnScrollListener.SCROLL_STATE_IDLE) {
//  if (mDecrementVirtualButtonPressed) {
//  mVirtualButtonPressedDrawable.setState(View.PRESSED_STATE_SET);
//  mVirtualButtonPressedDrawable.setBounds(0, 0, mRight, mTopSelectionDividerTop);
//  mVirtualButtonPressedDrawable.draw(canvas);
//  }
//  if (mIncrementVirtualButtonPressed) {
//  mVirtualButtonPressedDrawable.setState(PRESSED_STATE_SET);
//  mVirtualButtonPressedDrawable.setBounds(0, mBottomSelectionDividerBottom, mRight,
//   mBottom);
//  mVirtualButtonPressedDrawable.draw(canvas);
//  }
// }
int[] selectorIndices = mSelectorIndices;
for (int i = 0; i < selectorIndices.length; i++) {
int selectorIndex = selectorIndices[i];
String scrollSelectorValue = mSelectorIndexToStringCache.get(selectorIndex);
if (i != 1) {
mSelectorWheelPaint.setColor(Color.BLACK);
mSelectorWheelPaint.setTextSize(sp2px(16));
} else {
mSelectorWheelPaint.setColor(Color.parseColor("#000000"));//滑动时当前滚轴上的内容颜色
mSelectorWheelPaint.setTextSize(sp2px(20));
}
if ((showSelectorWheel && i != 1) ||
(i == 1 && mInputText.getVisibility() != VISIBLE)) {
Rect mRect = new Rect();
mSelectorWheelPaint.getTextBounds(scrollSelectorValue, 0, scrollSelectorValue.length(), mRect);
canvas.drawText(scrollSelectorValue, x, y, mSelectorWheelPaint);
}
y += mSelectorElementHeight;
}
// draw the selection dividers
if (showSelectorWheel && mSelectionDivider != null) {
mSelectionDivider = new ColorDrawable(Color.parseColor("#a0c4c4c4"));//滚轴线的颜色
// draw the top divider
int topOfTopDivider = mTopSelectionDividerTop;
int bottomOfTopDivider = topOfTopDivider + 2;
mSelectionDivider.setBounds(0, topOfTopDivider, mRight, bottomOfTopDivider);
mSelectionDivider.draw(canvas);
// draw the bottom divider
int bottomOfBottomDivider = mBottomSelectionDividerBottom;
int topOfBottomDivider = bottomOfBottomDivider - 2;
mSelectionDivider.setBounds(0, topOfBottomDivider, mRight, bottomOfBottomDivider);
mSelectionDivider.draw(canvas);
}
}
private int sp2px(int sp) {
float scale = mContext.getResources().getDisplayMetrics().scaledDensity;
return (int) (scale * sp + 0.5f);
}
}

用法:

先实现PickValueView.onSelectedChangeListener

然后TextView显示:

代码语言:javascript
复制
@Override
public void onSelected(PickValueView view, Object leftValue, Object middleValue, Object rightValue) {
String selectedStr = (String) leftValue;
tv_cj_num.setText(selectedStr);
}

完成,自定义弹窗里可以修改一些属性。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档