带文字的水平垂直seekbar,也可当普通seekbar使用,可以解决垂直滑动冲突。

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



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值