Android自定义垂直拖动搜索条进度条

来源:爱站网时间:2020-08-20编辑:网友分享
Android的进度条是不能满足我们的需求,通常我们都是拖动滑块作为自定义图像,并且背景也是自定义的,所以不要说太多废话,今天爱站技术频道小编就带你来了解Android自定义垂直拖动搜索条进度条吧!

Android的进度条是不能满足我们的需求,通常我们都是拖动滑块作为自定义图像,并且背景也是自定义的,所以不要说太多废话,今天爱站技术频道小编就带你来了解Android自定义垂直拖动搜索条进度条吧!

Android自带的SeekBar是水平的,要垂直的,必须自己写一个类,继承SeekBar。

一个简单的垂直SeekBar的例子:

(但是它其实是存在一些问题的。不过要是满足基本需要还是可以凑合的)

 

package com.example.helloverticalseekbar;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.SeekBar;

public class VerticalSeekBar extends SeekBar
{

  public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle)
  {
    super(context, attrs, defStyle);
  }

  public VerticalSeekBar(Context context, AttributeSet attrs)
  {
    super(context, attrs);
  }

  public VerticalSeekBar(Context context)
  {
    super(context);
  }

  @Override
  protected void onSizeChanged(int w, int h, int oldw, int oldh)
  {
    super.onSizeChanged(h, w, oldh, oldw);
  }

  @Override
  protected synchronized void onMeasure(int widthMeasureSpec,
      int heightMeasureSpec)
  {
    super.onMeasure(heightMeasureSpec, widthMeasureSpec);
    setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
  }

  @Override
  protected synchronized void onDraw(Canvas canvas)
  {
    canvas.rotate(-90);
    canvas.translate(-getHeight(), 0);
    super.onDraw(canvas);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event)
  {
    if (!isEnabled())
    {
      return false;
    }

    switch (event.getAction())
    {
      case MotionEvent.ACTION_DOWN:
      case MotionEvent.ACTION_MOVE:
      case MotionEvent.ACTION_UP:
        setProgress(getMax()
            - (int) (getMax() * event.getY() / getHeight()));
        onSizeChanged(getWidth(), getHeight(), 0, 0);
        break;

      case MotionEvent.ACTION_CANCEL:
        break;
    }

    return true;
  }

}

Demo中加上一个水平SeekBar作为对比,代码如下:

Activity:

HelloSeekBarActivity

package com.example.helloverticalseekbar;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class HelloSeekBarActivity extends Activity
{
  private SeekBar horiSeekBar = null;  
  private TextView horiText = null;
  
  private VerticalSeekBar verticalSeekBar = null;
  private TextView verticalText = null;

  @Override
  protected void onCreate(Bundle savedInstanceState)
  {
    Log.d(AppConstants.LOG_TAG, "onCreate");
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_hello_seek_bar);
    
    horiSeekBar = (SeekBar) findViewById(R.id.horiSeekBar);
    horiText = (TextView)findViewById(R.id.horiText);    
    horiSeekBar.setOnSeekBarChangeListener(horiSeekBarListener);
    
    verticalSeekBar = (VerticalSeekBar)findViewById(R.id.verticalSeekBar);
    verticalText = (TextView)findViewById(R.id.verticalText);
    verticalSeekBar.setOnSeekBarChangeListener(verticalSeekBarChangeListener);
  
    
    
  }

  @Override
  public boolean onCreateOptionsMenu(Menu menu)
  {
    getMenuInflater().inflate(R.menu.hello_seek_bar, menu);
    return true;
  }
  
  
  private OnSeekBarChangeListener horiSeekBarListener = new OnSeekBarChangeListener()
  {
    
    @Override
    public void onStopTrackingTouch(SeekBar seekBar)
    {
      
    }
    
    @Override
    public void onStartTrackingTouch(SeekBar seekBar)
    {
      
    }
    
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
        boolean fromUser)
    {
      Log.d(AppConstants.LOG_TAG, "Horizontal SeekBar --> onProgressChanged");
      horiText.setText(Integer.toString(progress));
      
    }
  };
  
  private OnSeekBarChangeListener verticalSeekBarChangeListener = new OnSeekBarChangeListener()
  {
    
    @Override
    public void onStopTrackingTouch(SeekBar seekBar)
    {
      
    }
    
    @Override
    public void onStartTrackingTouch(SeekBar seekBar)
    {
      
    }
    
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress,
        boolean fromUser)
    {
      Log.d(AppConstants.LOG_TAG, "Vertical SeekBar --> onProgressChanged");
      verticalText.setText(Integer.toString(progress));
      
    }
  };

}

布局:

activity_hello_seek_bar.xml

运行截图:

一个改进版的SeekBar

package com.example.helloverticalseekbarv2;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.view.ViewParent;
import android.widget.SeekBar;

public class VerticalSeekBar extends SeekBar
{
  private boolean mIsDragging;
  private float mTouchDownY;
  private int mScaledTouchSlop;
  private boolean isInScrollingContainer = false;

  public boolean isInScrollingContainer()
  {
    return isInScrollingContainer;
  }

  public void setInScrollingContainer(boolean isInScrollingContainer)
  {
    this.isInScrollingContainer = isInScrollingContainer;
  }

  /**
   * On touch, this offset plus the scaled value from the position of the
   * touch will form the progress value. Usually 0.
   */
  float mTouchProgressOffset;

  public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle)
  {
    super(context, attrs, defStyle);
    mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();

  }

  public VerticalSeekBar(Context context, AttributeSet attrs)
  {
    super(context, attrs);
  }

  public VerticalSeekBar(Context context)
  {
    super(context);
  }

  @Override
  protected void onSizeChanged(int w, int h, int oldw, int oldh)
  {

    super.onSizeChanged(h, w, oldh, oldw);

  }

  @Override
  protected synchronized void onMeasure(int widthMeasureSpec,
      int heightMeasureSpec)
  {
    super.onMeasure(heightMeasureSpec, widthMeasureSpec);
    setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth());
  }

  @Override
  protected synchronized void onDraw(Canvas canvas)
  {
    canvas.rotate(-90);
    canvas.translate(-getHeight(), 0);
    super.onDraw(canvas);
  }

  @Override
  public boolean onTouchEvent(MotionEvent event)
  {
    if (!isEnabled())
    {
      return false;
    }

    switch (event.getAction())
    {
      case MotionEvent.ACTION_DOWN:
        if (isInScrollingContainer())
        {

          mTouchDownY = event.getY();
        }
        else
        {
          setPressed(true);

          invalidate();
          onStartTrackingTouch();
          trackTouchEvent(event);
          attemptClaimDrag();

          onSizeChanged(getWidth(), getHeight(), 0, 0);
        }
        break;

      case MotionEvent.ACTION_MOVE:
        if (mIsDragging)
        {
          trackTouchEvent(event);

        }
        else
        {
          final float y = event.getY();
          if (Math.abs(y - mTouchDownY) > mScaledTouchSlop)
          {
            setPressed(true);

            invalidate();
            onStartTrackingTouch();
            trackTouchEvent(event);
            attemptClaimDrag();

          }
        }
        onSizeChanged(getWidth(), getHeight(), 0, 0);
        break;

      case MotionEvent.ACTION_UP:
        if (mIsDragging)
        {
          trackTouchEvent(event);
          onStopTrackingTouch();
          setPressed(false);

        }
        else
        {
          // Touch up when we never crossed the touch slop threshold
          // should
          // be interpreted as a tap-seek to that location.
          onStartTrackingTouch();
          trackTouchEvent(event);
          onStopTrackingTouch();

        }
        onSizeChanged(getWidth(), getHeight(), 0, 0);
        // ProgressBar doesn't know to repaint the thumb drawable
        // in its inactive state when the touch stops (because the
        // value has not apparently changed)
        invalidate();
        break;
    }
    return true;

  }

  private void trackTouchEvent(MotionEvent event)
  {
    final int height = getHeight();
    final int top = getPaddingTop();
    final int bottom = getPaddingBottom();
    final int available = height - top - bottom;

    int y = (int) event.getY();

    float scale;
    float progress = 0;

    // 下面是最小值
    if (y > height - bottom)
    {
      scale = 0.0f;
    }
    else if (y 

以上就是关于Android自定义垂直拖动搜索条进度条的介绍,如果你也想要学习这些知识,可以到js.aizhan.com学习,相信这里肯定有你想要的知识。

上一篇:Android开发使用自定义视图在画布上绘制圆角矩形

下一篇:Android编程双工对话布局实现及事件监控方法实例

您可能感兴趣的文章

相关阅读

热门软件源码

最新软件源码下载