温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

android中怎么自定义一个滚轴选择器

发布时间:2021-07-29 16:09:48 来源:亿速云 阅读:129 作者:Leah 栏目:编程语言

android中怎么自定义一个滚轴选择器,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。

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中的样式:

<!-- 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

<?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:

<?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:

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

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 piders  if (showSelectorWheel && mSelectionDivider != null) {   mSelectionDivider = new ColorDrawable(Color.parseColor("#a0c4c4c4"));//滚轴线的颜色   // draw the top pider   int topOfTopDivider = mTopSelectionDividerTop;   int bottomOfTopDivider = topOfTopDivider + 2;   mSelectionDivider.setBounds(0, topOfTopDivider, mRight, bottomOfTopDivider);   mSelectionDivider.draw(canvas);    // draw the bottom pider   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显示:

@Overridepublic void onSelected(PickValueView view, Object leftValue, Object middleValue, Object rightValue) { String selectedStr = (String) leftValue; tv_cj_num.setText(selectedStr);}

关于android中怎么自定义一个滚轴选择器问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI