您的位置:首页 > 其它

带文字的水平垂直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();
}
}




3.使用方法
可以直接使用
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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐