带文字的水平垂直seekbar,也可当普通seekbar使用,可以解决垂直滑动冲突。
2016-09-23 17:08
337 查看
1.先来看效果图
2.直接贴代码
package cn.funny.main; import android.content.Context; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.util.AttributeSet; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.TextView; public class HorizontalTextSeekBar extends FrameLayout { private View mProgressBg; private View mBg; private View mSecondaryProgressBg; private FrameLayout mSlider; private TextView mTextView; //字 private int mProgress = 0; private int mSecondaryProgress = 0; private int mMax = 100; private boolean mTrackingTouch = false; private OnSeekBarChangeListener mOnSeekBarChangeListener; private int mBGSize =6; //进度条大小 private int mBGRadius=20; //进度条圆角 private int mCircleSize=60; //圆的大小 public HorizontalTextSeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initialize(context); } public HorizontalTextSeekBar(Context context, AttributeSet attrs) { super(context, attrs); initialize(context); } public HorizontalTextSeekBar(Context context) { super(context); initialize(context); } public interface OnSeekBarChangeListener { void onProgressChanged(HorizontalTextSeekBar seekBar, int progress, boolean fromUser); void onStartTrackingTouch(HorizontalTextSeekBar seekBar); void onStopTrackingTouch(HorizontalTextSeekBar seekBar); } private void initialize(Context context) { LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, mBGSize); params.gravity = Gravity.CENTER_VERTICAL; mBg = new View(context); addView(mBg, params); GradientDrawable drawable = new GradientDrawable(); drawable.setColor(0xffbdbdbd); drawable.setCornerRadius(mBGRadius); mBg.setBackgroundDrawable(drawable); params = new LayoutParams(0, mBGSize); params.gravity = Gravity.CENTER_VERTICAL; mSecondaryProgressBg = new View(context); addView(mSecondaryProgressBg, params); drawable = new GradientDrawable(); drawable.setColor(0xffff5959); drawable.setCornerRadius(mBGRadius); mSecondaryProgressBg.setBackgroundDrawable(drawable); params = new LayoutParams(0, mBGSize); params.gravity = Gravity.CENTER_VERTICAL; drawable = new GradientDrawable(); drawable.setColor(0xff2196f3); drawable.setCornerRadius(mBGRadius); mProgressBg = new View(context); mProgressBg.setBackgroundDrawable(drawable); addView(mProgressBg, params); params = new LayoutParams(mCircleSize, mCircleSize); params.gravity = Gravity.CENTER_VERTICAL; mSlider = new FrameLayout(context); addView(mSlider, params); drawable = new GradientDrawable(); drawable.setColor(0xffdddddd); drawable.setShape(GradientDrawable.OVAL); params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.gravity=Gravity.CENTER; mTextView=new TextView(context); mTextView.setGravity(Gravity.CENTER); mTextView.setTextSize(12); mTextView.setIncludeFontPadding(false); mTextView.setText("0"); mTextView.setTextColor(0xff666666); mSlider.addView(mTextView, params); mSlider.setBackgroundDrawable(drawable); setClickable(true); } public String getText() { return mTextView.getText().toString(); } public void setmText(String mText) { mTextView.setText(mText); } public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) { mOnSeekBarChangeListener = l; } public void setThumb(Drawable d) { mSlider.setBackgroundDrawable(d); } /** * 设置圆的大小 * @param w * @param h */ public void setThumbSize(int w, int h) { LayoutParams params = (LayoutParams) mSlider.getLayoutParams(); params.width = w; params.height = h; mSlider.setLayoutParams(params); } /** * 设置进度条的高度 * @param size */ public void setProgressSize(int size) { LayoutParams params = (LayoutParams) mProgressBg.getLayoutParams(); params.height = size; mProgressBg.setLayoutParams(params); params = (LayoutParams) mSecondaryProgressBg.getLayoutParams(); params.height = size; mSecondaryProgressBg.setLayoutParams(params); params = (LayoutParams) mBg.getLayoutParams(); params.height = size; mBg.setLayoutParams(params); } public void setProgressBackground(Drawable drawable) { mBg.setBackgroundDrawable(drawable); } public void setProgressDrawable(Drawable drawable) { mProgressBg.setBackgroundDrawable(drawable); } public void setSecondaryProgressDrawable(Drawable drawable) { mSecondaryProgressBg.setBackgroundDrawable(drawable); } public void setMax(int max) { mMax = max; } public void setProgress(int progress) { setProgress(progress, false); } public int getMax() { return mMax; } public int getProgress() { return mProgress; } /** * 设置第一进度条 * @param progress * @param fromUser */ private void setProgress(int progress, boolean fromUser) { if (progress < 0) progress = 0; if (progress > mMax) progress = mMax; if (mProgress != progress) { mProgress = progress; updateProgress(fromUser); } mTextView.setText(progress+""); } /** * 更新第一进度条和圆的位置 * @param fromUser */ private void updateProgress(boolean fromUser) { int paddingLeft = getPaddingLeft(); int paddingRight = getPaddingRight(); int w = getWidth() - paddingLeft - paddingRight; if (w > 0 && mMax > 0) { LayoutParams params = (LayoutParams) mProgressBg.getLayoutParams(); params.width = (w * mProgress / mMax); mProgressBg.setLayoutParams(params); params = (LayoutParams) mSlider.getLayoutParams(); params.leftMargin = (w - params.width) * mProgress / mMax; mSlider.setLayoutParams(params); } if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onProgressChanged(this, mProgress, fromUser); } } /** * 设置第二进度条 * @param progress */ public void setSecondaryProgress(int progress) { if (progress < 0) progress = 0; if (progress > mMax) progress = mMax; mSecondaryProgress = progress; updateSecondaryProgress(); } /** * 更新第二进度条 */ private void updateSecondaryProgress() { int paddingLeft = getPaddingLeft(); int paddingRight = getPaddingRight(); int w = getWidth() - paddingLeft - paddingRight; if (w > 0 && mMax > 0) { LayoutParams params = (LayoutParams) mSecondaryProgressBg.getLayoutParams(); params.width = w * mSecondaryProgress / mMax; mSecondaryProgressBg.setLayoutParams(params); } } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int action = ev.getAction(); int x = (int) ev.getX(); int paddingLeft = getPaddingLeft(); int paddingRight = getPaddingRight(); int w = getWidth() - paddingLeft - paddingRight; if (x < paddingLeft) { x = paddingLeft; } if (x > w + paddingLeft) { x = w + paddingLeft; } x -= paddingLeft; if (action == MotionEvent.ACTION_DOWN) { int progress = mMax * x / w; if (progress != mProgress) { if (mTrackingTouch == false) { mTrackingTouch = true; if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStartTrackingTouch(this); } } setProgress(progress, true); } } else if (action == MotionEvent.ACTION_MOVE) { int progress = mMax * x / w; if (progress != mProgress) { if (mTrackingTouch == false) { mTrackingTouch = true; if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStartTrackingTouch(this); } } setProgress(progress, true); } } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { mTrackingTouch = false; if (mOnSeekBarChangeListener != null) { mOnSeekBarChangeListener.onStopTrackingTouch(this); } } return super.dispatchTouchEvent(ev); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); //第一进度条 updateProgress(false); //第二进度条 //updateSecondaryProgress(); } }
可以直接使用
HorizontalTextSeekBar mSeekBar=new HorizontalTextSeekBar(this);
也可以
<cn.funny.main.HorizontalTextSeekBar android:layout_centerInParent="true" android:layout_margin="20dp" android:id="@+id/seekBar" android:layout_width="wrap_content" android:layout_height="wrap_content"> </cn.funny.main.HorizontalTextSeekBar>
然后设置一下
<span style=" c790 font-size:14px;">//小于100,不然到数字一百会出界 mSeekBar.setMax(10); </span><span style="font-size:18px;color:#cc0000;"><strong> //这样设置setprogress就可以初始化 //如果单独mSeekBar.setProgress(5); 会看到第一条进度线没出现</strong></span><span style="font-size:14px;"> mSeekBar.post(new Runnable() { @Override public void run() { mSeekBar.setProgress(5); } });</span>
4.可以吧seekbar设置成垂直类型
附上垂直代码可以解决垂直滑动冲突
package cn.funny.main; import android.content.Context; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.util.AttributeSet; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; import android.widget.TextView; public class VerticalSeekBar extends FrameLayout { public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initialize(context); } public VerticalSeekBar(Context context, AttributeSet attrs) { super(context, attrs); initialize(context); } public VerticalSeekBar(Context context) { super(context); initialize(context); } private View mProgressBg; private View mSecondaryProgressBg; private View mBg; private FrameLayout mSlider; private int mProgress = 0; private int mSecondaryProgress = 0; private int mMax = 100; private boolean mTrackingTouch = false; private OnSeekBarChangeListener mOnSeekBarChangeListener; private int mBGSize =6; //进度条大小 private int mBGRadius=20; //进度条圆角 private int mCircleSize=60; //圆的大小 private TextView mTextView; //字 public interface OnSeekBarChangeListener { void onProgressChanged(VerticalSeekBar seekBar, int progress, boolean fromUser); void onStartTrackingTouch(VerticalSeekBar seekBar); void onStopTrackingTouch(VerticalSeekBar seekBar); void onrequestDisallowInterceptTouchEvent(boolean enable); } private void initialize(Context context) { LayoutParams params = new LayoutParams(mBGSize, LayoutParams.MATCH_PARENT); params.gravity = Gravity.CENTER_HORIZONTAL; mBg = new View(context); addView(mBg, params); GradientDrawable drawable = new GradientDrawable(); drawable.setColor(0xffbcbab8); drawable.setCornerRadius(mBGRadius); mBg.setBackgroundDrawable(drawable); params = new LayoutParams(mBGSize, 0); params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; mSecondaryProgressBg = new View(context); addView(mSecondaryProgressBg, params); drawable = new GradientDrawable(); drawable.setColor(0xffff5959); drawable.setCornerRadius(mBGRadius); mSecondaryProgressBg.setBackgroundDrawable(drawable); params = new LayoutParams(mBGSize, 0); params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; mProgressBg = new View(context); addView(mProgressBg, params); drawable = new GradientDrawable(); drawable.setColor(0xffff5959); drawable.setCornerRadius(mBGRadius); mProgressBg.setBackgroundDrawable(drawable); params = new LayoutParams(mCircleSize, mCircleSize); params.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM; mSlider = new FrameLayout(context); addView(mSlider, params); drawable = new GradientDrawable(); drawable.setColor(0xffdddddd); drawable.setShape(GradientDrawable.OVAL); params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); params.gravity=Gravity.CENTER; mTextView=new TextView(context); mTextView.setGravity(Gravity.CENTER); mTextView.setTextSize(12); mTextView.setIncludeFontPadding(false); mTextView.setText("0"); mTextView.setTextColor(0xff666666); mSlider.addView(mTextView, params); mSlider.setBackgroundDrawable(drawable); setClickable(true); } public String getText() { return mTextView.getText().toString(); } public void setmText(String mText) { mTextView.setText(mText); } public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) { mOnSeekBarChangeListener = l; } public void setThumb(Drawable d) { mSlider.setBackgroundDrawable(d); } public void setThumbSize(int w, int h) { LayoutParams params = (LayoutParams)mSlider.getLayoutParams(); params.width = w; params.height = h; mSlider.setLayoutParams(params); } public void setProgressSize(int size) { LayoutParams params = (LayoutParams)mProgressBg.getLayoutParams(); params.width = size; mProgressBg.setLayoutParams(params); params = (LayoutParams)mSecondaryProgressBg.getLayoutParams(); params.width = size; mSecondaryProgressBg.setLayoutParams(params); params = (LayoutParams)mBg.getLayoutParams(); params.width = size; mBg.setLayoutParams(params); } public void setProgressBackground(Drawable drawable) { mBg.setBackgroundDrawable(drawable); } public void setProgressDrawable(Drawable drawable) { mProgressBg.setBackgroundDrawable(drawable); } public void setSecondaryProgressDrawable(Drawable drawable) { mSecondaryProgressBg.setBackgroundDrawable(drawable); } public void setMax(int max) { mMax = max; } public void setProgress(int progress) { setProgress(progress, false); } public int getProgress() { return mProgress; } private void setProgress(int progress, boolean fromUser) { if(progress < 0) progress = 0; if(progress > mMax) progress = mMax; if(mProgress != progress) { mProgress = progress; updateProgress(fromUser); } mTextView.setText(progress+""); } private void updateProgress(boolean fromUser) { int paddingTop = getPaddingTop(); int paddingBottom = getPaddingBottom(); int h = getHeight() - paddingTop - paddingBottom; if(h > 0) { LayoutParams params = (LayoutParams)mProgressBg.getLayoutParams(); params.height = h*mProgress/mMax; mProgressBg.setLayoutParams(params); params = (LayoutParams)mSlider.getLayoutParams(); params.bottomMargin = (h-params.height)*mProgress/mMax; mSlider.setLayoutParams(params); } if(mOnSeekBarChangeListener != null){ mOnSeekBarChangeListener.onProgressChanged(this, mProgress, fromUser); } } public void setSecondaryProgress(int progress) { if(progress < 0) progress = 0; if(progress > mMax) progress = mMax; mSecondaryProgress = progress; updateSecondaryProgress(); } private void updateSecondaryProgress() { int paddingTop = getPaddingTop(); int paddingBottom = getPaddingBottom(); int h = getHeight() - paddingTop - paddingBottom; if(h > 0) { LayoutParams params = (LayoutParams)mSecondaryProgressBg.getLayoutParams(); params.height = h*mSecondaryProgress/mMax; mSecondaryProgressBg.setLayoutParams(params); } } @Override public boolean dispatchTouchEvent(MotionEvent ev) { int action = ev.getAction(); int y = (int)ev.getY(); int paddingTop = getPaddingTop(); int paddingBottom = getPaddingBottom(); int h = getHeight() - paddingTop - paddingBottom; if(y < paddingTop){ y = paddingTop; } if(y > h + paddingTop){ y = h + paddingTop; } y -= paddingTop; if(action == MotionEvent.ACTION_DOWN) { if(mOnSeekBarChangeListener != null){ mOnSeekBarChangeListener.onrequestDisallowInterceptTouchEvent(true); } int progress = mMax*(h-y)/h; if(progress != mProgress) { if(mTrackingTouch == false){ mTrackingTouch = true; if(mOnSeekBarChangeListener != null){ mOnSeekBarChangeListener.onStartTrackingTouch(this); } } setProgress(progress, true); } } else if(action == MotionEvent.ACTION_MOVE) { int progress = mMax*(h-y)/h; if(progress != mProgress) { if(mTrackingTouch == false){ mTrackingTouch = true; if(mOnSeekBarChangeListener != null){ mOnSeekBarChangeListener.onStartTrackingTouch(this); } } setProgress(progress, true); } } else if(action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { if(mOnSeekBarChangeListener != null){ mOnSeekBarChangeListener.onrequestDisallowInterceptTouchEvent(false); } mTrackingTouch = false; if(mOnSeekBarChangeListener != null){ mOnSeekBarChangeListener.onStopTrackingTouch(this); } } return super.dispatchTouchEvent(ev); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { updateProgress(false); //updateSecondaryProgress(); super.onSizeChanged(w, h, oldw, oldh); } }
相关文章推荐
- 事件分发_水平滑动和垂直冲突解决
- ScrollView嵌套可以水平滚动的自定义控件时滑动事件冲突问题解决办法
- 图片和span水平垂直居中问题(主要解决小图标+文字水平垂直居中的问题)
- 使用button标签让文字垂直水平居中
- 解决使用`SwipeRefreshLayout`下拉刷新和左右滑动事件冲突的问题
- 解决ScrollView和RecyclerView 冲突问题 为了ScrollView可以显示RecyclerView 垂直布局
- 实现水平ListView,并且解决水平ListView在ScrollView中Listview中出现的滑动冲突
- cocosStudio的使用-04-PageView无法垂直滑动解决办法
- ViewPager禁止滑动以及它与内层滑动控件水平方向上事件冲突的解决方法
- [乐意黎]复选框(checkbox)和单选框(radio)与文字水平垂直居中对齐的解决方法
- [置顶] 使用ViewFlow实现无限循环轮播图和滑动冲突解决
- android 布局 使用 viewPager 时,如何解决 和 子页面 长按滑动 冲突问题
- 关于使用ViewFlipper实现手势滑动切换及其与ScrollView冲突的解决办法
- Android使用ScrollView+ListView时发生滑动冲突的解决办法
- 快速解决jquery.touchSwipe左右滑动和垂直滚动条冲突
- ViewPager禁止滑动以及它与内层滑动控件水平方向上事件冲突的解决方法
- 解决HorizontalScrollView与SeekBar滑动冲突的问题.
- Android HorizontalScrollView 水平滑动 里面放listView 解决滑动冲突
- 外部解决滑动冲突水平方向和竖直方向滑动冲突实例
- 解决viewpager与其他可以左右滑动的事件冲突