GVKun编程网logo

Android自定义垂直拖动seekbar进度条(android 拖动条)

12

在本文中,我们将带你了解Android自定义垂直拖动seekbar进度条在这篇文章中,我们将为您详细介绍Android自定义垂直拖动seekbar进度条的方方面面,并解答android拖动条常见的疑惑

在本文中,我们将带你了解Android自定义垂直拖动seekbar进度条在这篇文章中,我们将为您详细介绍Android自定义垂直拖动seekbar进度条的方方面面,并解答android 拖动条常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的Android ProgressBar自定义图片进度,自定义渐变色进度条、Android SeekBar 自定义使用图片和颜色显示、Android seekbar实现可拖动进度条、android Seekbar沿着seekbar显示进度值

本文目录一览:

Android自定义垂直拖动seekbar进度条(android 拖动条)

Android自定义垂直拖动seekbar进度条(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);
        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,"Vertical SeekBar --> onProgressChanged");
      verticalText.setText(Integer.toString(progress));
      
    }
  };

}

布局:

activity_hello_seek_bar.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:paddingBottom="@dimen/activity_vertical_margin"
  android:paddingLeft="@dimen/activity_horizontal_margin"
  android:paddingRight="@dimen/activity_horizontal_margin"
  android:paddingTop="@dimen/activity_vertical_margin"
  tools:context=".HelloSeekBaractivity" >

  <TextView
    android:id="@+id/myTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:text="@string/hello_world" />

  <SeekBar
    android:id="@+id/horiSeekBar"
    android:layout_width="match_parent"
    android:layout_height="20dp"
    android:layout_below="@id/myTextView" />

  <TextView
    android:id="@+id/horiText"
    android:layout_width="wrap_content"
    android:layout_height="20dp"
    android:layout_below="@id/horiSeekBar"
    android:text="horizontal" />

  <com.example.helloverticalseekbar.VerticalSeekBar
    android:id="@+id/verticalSeekBar"
    android:layout_width="wrap_content"
    android:layout_height="200dp"
    android:layout_below="@id/horiText" />

  <TextView
    android:id="@+id/verticalText"
    android:layout_width="wrap_content"
    android:layout_height="20dp"
    android:layout_below="@id/verticalSeekBar"
    android:text="vertical" />

</RelativeLayout>

运行截图:

一个改进版的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,defStyle);
    mScaledTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();

  }

  public VerticalSeekBar(Context context,int oldh)
  {

    super.onSizeChanged(h,oldw);

  }

  @Override
  protected synchronized void onMeasure(int widthMeasureSpec,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(),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(),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(),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 < top)
    {
      scale = 1.0f;
    }
    else
    {
      scale = (float) (available - y + top) / (float) available;
      progress = mTouchProgressOffset;
    }

    final int max = getMax();
    progress += scale * max;

    setProgress((int) progress);

  }

  /**
   * This is called when the user has started touching this widget.
   */
  void onStartTrackingTouch()
  {
    mIsDragging = true;
  }

  /**
   * This is called when the user either releases his touch or the touch is
   * canceled.
   */
  void onStopTrackingTouch()
  {
    mIsDragging = false;
  }

  private void attemptClaimDrag()
  {
    ViewParent p = getParent();
    if (p != null)
    {
      p.requestdisallowInterceptTouchEvent(true);
    }
  }

  @Override
  public synchronized void setProgress(int progress)
  {

    super.setProgress(progress);
    onSizeChanged(getWidth(),0);

  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。

Android ProgressBar自定义图片进度,自定义渐变色进度条

Android ProgressBar自定义图片进度,自定义渐变色进度条

java.lang.Object
    ↳    android.view.View
        ↳    android.widget.ProgressBar
直接子类
AbsSeekBar
间接子类
RatingBar, SeekBar

在某些操作的进度中的可视指示器,为用户呈现操作的进度,还它有一个次要的进度条,用来显示中间进度,如在流媒体播放的缓冲区的进度。一个进度条也可不确定其进度。在不确定模式下,进度条显示循环动画。这种模式常用于应用程序使用任务的长度是未知的。进度条也就是一个表示运转的过程,例如发送短信,连接网络等等,表示一个过程正在执行中

1、android.widget. ProgressBar,继承自android.view.View 。在android.widget包中。对应对话框ProgressDialog。ProgressBar有两种展示方式,表盘形式(普通、小、大)和条形填充形式。在layout定义时,需要通过设施style属性类设置展示方式。

ProgressBar的样式有四种:

android:progressBarStyle:默认进度条样式,不确定模式
android:progressBarStyleHorizontal:水平进度条样式
android:progressBarStyleLarge :大号进度条样式,也是不确定进度模式 

android:progressBarStyleSmall :小号进度条样式,也是不确定进度模式 

二、XML重要属性

             android:max--  这事进度条长度最大值

             android:progress--设定度条当前进度值

            android:secondaryProgress--第二进度条进度值

    android:progressBarStyle:默认进度条样式

    android:progressBarStyleHorizontal:水平样式

       style="?android:attr/progressBarStyleLarge" --- 属性风格类型--大圆圈,如下图

       style=”?android:attr/progressBarStyleSmall”--- 属性风格类型--小圆圈,如下图:

       

        --水平进度条 --如下图:

       

        几秒钟之后自动滚到到如下:

       

也可以用下面的形式代替上面的形式的:

?

1
2
3
< ProgressBar style = "@android :style/Widget.ProgressBar.Inverse" />//中
< ProgressBar style = "@android :style/Widget.ProgressBar.Large.Inverse" /> //大圆
< ProgressBar style = "@android :style/Widget.ProgressBar.Small.Inverse" /> //小圆


三、重要方法

    getMax():返回这个进度条的范围的上限

    getProgress():返回当前进度值

    getSecondaryProgress():返回次要当前进度值

    incrementProgressBy(int diff):指定增加的进度--即步长

    isIndeterminate():指示进度条是否在不确定模式下

    setIndeterminate(boolean indeterminate):设置不确定模式下

    setVisibility(int v):设置该进度条是否可视

四、重要事件

    onSizeChanged(int w, int h, int oldw, int oldh):当进度值改变时引发此事件

接下来看案例:

1.定义一个布局文件progressbar.xml

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<? xml version = "1.0" encoding = "utf-8" ?>
< ScrollView xmlns:android = "http://schemas.android.com/apk/res/android"
     
     android:layout_width = "fill_parent"
     android:layout_height = "match_parent"
     >
     < LinearLayout
         android:layout_width = "fill_parent"
         android:layout_height = "match_parent"
         android:orientation = "vertical" >
< TextView
     android:id = "@+id/startText"
     android:layout_width = "fill_parent"
     android:layout_height = "wrap_content"
     android:text = "垂直的----标题上面也有一个进度条哦"
     android:textColor = "#CD0000"
     android:background = "#BC8F8F"
     />
    <!-- style=”?android:attr/progressBarStyleLarge”大圆圈 -->
     < ProgressBar
       android:id = "@+id/progtessBer_btn_id1"
       android:layout_width = "wrap_content"
       android:layout_height = "wrap_content"
       style = "?android:attr/progressBarStyleLarge"
         />
      <!-- style=”?android:attr/progressBarStyleSmall”小圆圈 -->
     < ProgressBar
       android:layout_width = "wrap_content"
       android:layout_height = "wrap_content"
       style = "?android:attr/progressBarStyleSmall"
       android:layout_gravity = "center_horizontal"
         />
     < TextView
     android:id = "@+id/startText1"
     android:layout_width = "fill_parent"
     android:layout_height = "wrap_content"
     android:text = "水平的"
     android:textColor = "#aaaaaa"
     />
      <!--   水平进度条 -->
     < ProgressBar
      android:id = "@+id/progtessBer_btn_id2"
      android:layout_width = "fill_parent"
      android:layout_height = "wrap_content"
      style = "?android:attr/progressBarStyleHorizontal"
      />
     < TextView
      android:layout_width = "fill_parent"
      android:layout_height = "wrap_content"
      android:text = "@string/progress_text"
      />
     </ LinearLayout >
</ ScrollView >

2.之后定义java文件:ProgressBarDemo.java

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
package com.dream.app.start.first.prograssbar;
import com.dream.app.start.MenuDemo;
import com.dream.app.start.R;
import com.dream.app.start.R.id;
import com.dream.app.start.R.layout;
import com.dream.app.start.utils.PublicClass;
 
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.text.method.ScrollingMovementMethod;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
 
public class ProgressBarDemo extends PublicClass {
     private ProgressBar  progressbar,progressbar_1;
     Button  btn1,btn2;
     private int  prostatus= 0 ;
     //创建一个handler对象
     private  Handler  handler= new Handler();
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         // TODO Auto-generated method stub
         super .onCreate(savedInstanceState);
         
         
           //在标题条里放置进度条。请求窗口特色风格,这里设置成不明确的进度风格
           requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
          
           //设置窗口进度条特性风格
//         requestWindowFeature(Window.FEATURE_PROGRESS);
 
          
           setContentView(R.layout.progressbar);
           //设置标题栏中的不明确的进度条是否可以显示,当你需要表示处理中的时候设置为True,处理完毕后设置为false
 
           setProgressBarIndeterminateVisibility( true );
         
         //设置进度条进度值,要乘以100的
//          setProgress(60*100);
//          setSecondaryProgress(80*100);
 
         btn2=(Button)findViewById(R.id.button_cancel);
//      btn2.setOnClickListener(onClick);
         progressbar=(ProgressBar)findViewById(R.id.progtessBer_btn_id2);
         progressbar_1=(ProgressBar)findViewById(R.id.progtessBer_btn_id1);
         //设置进度条的最大值
         progressbar.setMax( 100000 );
         progressbar_1.setMax( 100000 );
         //新开启一个进程
         new Thread( new Runnable() {
             
             @Override
             public void run() {
                 // 循环1000次,不断地更新prostatus状态值
                 while (prostatus++< 100000 ) {
                     //将一个Runnable对象添加到消息队列中去
                     //并且当执行该对象的时候,执行run
                     handler.post( new Runnable() {
                         
                         @Override
                         public void run() {
                             //重新设置进度条当前的值
                             progressbar.setProgress(prostatus);
                             progressbar_1.setProgress(prostatus);
                             
                         }
                     });    
                 }
             }
         }).start();
         
     }
 
//toast方法
     private void toastshow(String str) {
         Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
 
     }
 
}

运行效果如下:


二:用图片实现滚动效果:

1.添加图片到drawable下

 2.自定义图片资源文件iamge_progress.xml

?

1
2
3
4
5
6
7
<? xml version = "1.0" encoding = "utf-8" ?>
< animated-rotate
     xmlns:android = "http://schemas.android.com/apk/res/android"
     android:drawable = "@drawable/image_progress"
     android:pivotX = "50%"
     android:pivotY = "50%"
     />

3.定义布局文件,progress.xml

?

1
2
3
4
5
6
7
8
9
10
11
<? xml version = "1.0" encoding = "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:orientation = "vertical"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:gravity = "center" >
< ProgressBar
         android:indeterminateDrawable = "@drawable/drawable_progress"
         android:layout_height = "100dp"
         android:layout_width = "100dp" />
</ LinearLayout >

 运行效果如下:

三》自定义渐变色进度条:

    定义drawable资源文件color_progressbar.xml

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<? xml version = "1.0" encoding = "utf-8" ?>
< layer-list xmlns:android = "http://schemas.android.com/apk/res/android" >
    < item android:id = "@android:id/background" >  
     < shape >  
         < corners android:radius = "5dip" />  
         < gradient android:startColor = "#ff9d9e9d"  
                 android:centerColor = "#ff5a5d5a"  
                 android:centerY = "0.75"  
                 android:endColor = "#ff747674"  
                 android:angle = "270"  
         />  
     </ shape >  
</ item >  
< item android:id = "@android:id/secondaryProgress" >  
     < clip >  
         < shape >  
             < corners android:radius = "5dip" />  
             < gradient android:startColor = "#80ffd300"  
                     android:centerColor = "#80ffb600"  
                     android:centerY = "0.75"  
                     android:endColor = "#a0ffcb00"  
                     android:angle = "270"  
             />  
         </ shape >  
     </ clip >  
</ item >  
< item android:id = "@android:id/progress"  
>  
     < clip >  
         < shape >  
             < corners android:radius = "5dip" />  
             < gradient android:startColor = "#FF3030"  
                 android:endColor = "#AEEEEE"  
                 android:angle = "270" />  
         </ shape >  
     </ clip >  
</ item >
</ layer-list >

2.定义对应的不布局文件:progressbar.xml在此文件中引用我们定义的drawable资源配置文件

?

1
2
3
4
5
6
7
8
9
10
11
12
<? xml version = "1.0" encoding = "utf-8" ?>
< LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
android:orientation = "vertical"
android:layout_width = "fill_parent"
android:layout_height = "fill_parent"
android:gravity = "center" >
< ProgressBar
                 android:id = "@+id/color_progressBar"
         android:indeterminateDrawable = "@drawable/color_progress"
         android:layout_height = "wrap_content"
         android:layout_width = "match_parent" />
</ LinearLayout >

或者在代码中给进度条设置自定义资源文件:

效果如下:

四:自定义progressbar颜色:

1.定义一个图片资源文件:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<? xml version = "1.0" encoding = "utf-8" ?> 
< rotate xmlns:android = "http://schemas.android.com/apk/res/android" 
     android:fromDegrees = "0" 
     android:pivotX = "50%" 
     android:pivotY = "50%" 
     android:toDegrees = "360"
   
     < shape 
         android:innerRadiusRatio = "3" 
         android:shape = "ring" 
         android:thicknessRatio = "8" 
         android:useLevel = "false"
   
         < gradient 
             android:centerColor = "#FFFFFF" 
             android:centerY = "0.50" 
             android:endColor = "#FFFF00" 
             android:startColor = "#000000" 
             android:type = "sweep" 
             android:useLevel = "false" /> 
     </ shape
   
</ rotate >

2.定义布局文件:

?

1
2
3
4
5
< ProgressBar
         android:id = "@+id/color_progressBar2"
     android:indeterminateDrawable = "@drawable/color_progress2"
     android:layout_height = "wrap_content"
     android:layout_width = "wrap_content" />

3.效果:

 

 


Android SeekBar 自定义使用图片和颜色显示

Android SeekBar 自定义使用图片和颜色显示

案例使用的图片如下:

                         

1. 在 res/drawable 目录下新增一个 xml 风格文件,seekbar_define_style.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list
	xmlns:android="http://schemas.android.com/apk/res/android">
	<!-- 未选中 -->
	<item
		android:id="@android:id/background"
		android:drawable="@drawable/hou"/>
	<!-- 中 -->
	<item
		android:id="@android:id/progress"
		android:drawable="@drawable/qian"/>
	<item
		android:id="@android:id/secondaryProgress"
		android:drawable="@drawable/qian"/>
</layer-list>

2. 在 res/drawable 下定义个 seekbar_thumb.xml 文件

 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">        
       
    <!-- 按下状态-->  
    <item    
        android:state_focused="true"    
        android:state_pressed="true"    
        android:drawable="@drawable/ic_launcher" />        
    <!-- 普通无焦点状态 -拖动按钮-->  
    <item    
        android:state_focused="false"    
        android:state_pressed="false"  
        android:drawable="@drawable/orbino_icon_pack_006" />              
    <!-- 有焦点状态-->  
    <item    
        android:state_focused="true"    
        android:state_pressed="false"              
        android:drawable="@drawable/ios" />         
    <!-- 有焦点 -->  
    <item    
        android:state_focused="true"              
        android:drawable="@drawable/ios"/>
</selector>

3. 在 res/layut 下定义布局资源文件 seekbar_define.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
         android:orientation="vertical"
        >
    <TextView 
	android:id="@+id/seekbar_tetview_one"
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content"
	android:text="SeekBar自定义"
	/>
    <TextView 
	android:id="@+id/seekbar_tetview_two"
	android:layout_width="wrap_content" 
	android:layout_height="wrap_content"
	android:text="SeekBar拖动时信息提示"
	/>
    <SeekBar
    android:layout_width="321px"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:maxHeight="20px"
    android:minHeight="20px"
    android:paddingLeft="18px"
    android:paddingRight="18px"
    android:max="100"
    android:progressDrawable="@drawable/seekbar_define_style"
    android:thumb="@drawable/seekbar_thumb"
    android:id="@+id/seekBar"/>
 </LinearLayout>
</ScrollView>

4. 定义 java 文件通过 引用布局文件:

 

package com.test;

import android.R.integer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;

public class SeekBarDemo_DefineDemo extends Activity {
	private SeekBar seekBar;
	private TextView textView_one, textView_two;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.seekbar_define);

		seekBar = (SeekBar) findViewById(R.id.seekBar);

		textView_one = (TextView) findViewById(R.id.seekbar_tetview_one);

		textView_two = (TextView) findViewById(R.id.seekbar_tetview_two);

		seekBar.setOnSeekBarChangeListener(seekbarChangeListener);

	}

	private OnSeekBarChangeListener seekbarChangeListener = new OnSeekBarChangeListener() {

		// 停止拖动时执行
		@Override
		public void onStopTrackingTouch(SeekBar seekBar) {
			// TODO Auto-generated method stub
			textView_two.setText("停止拖动了!");

		}

		// 在进度开始改变时执行
		@Override
		public void onStartTrackingTouch(SeekBar seekBar) {
			// TODO Auto-generated method stub
			textView_two.setText("进度开始改变");
		}

		// 当进度发生改变时执行
		@Override
		public void onProgressChanged(SeekBar seekBar, int progress,
				boolean fromUser) {
			textView_two.setText("正在进行拖动操作,还没有停下来一直再拖动");
			Message message = new Message();

			Bundle bundle = new Bundle();// 存放数据

			float pro = seekBar.getProgress();

			float num = seekBar.getMax();

			float result = (pro / num) * 100;
			bundle.putFloat("key", result);

			message.setData(bundle);

			message.what = 0;

			handler.sendMessage(message);

		}
	};

	/**
	 * 用Handler来更新UI
	 */
	private Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			textView_one.setText("当前拖动位置占 :       "
					+ msg.getData().getFloat("key") + "/100");

		}

	};

}

最后执行效果:

 程序启动后的默认显示

 

拖动过程中的显示

 

停止拖动后的显示

 二:使用颜色显示,和尚面是一样的,只有我们定义颜色资源来替代图片资源文件 seekbar_define_color_style.xml:如下:

<?xml version="1.0" encoding="UTF-8"?>     
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">     
  
   <item android:id="@android:id/background"
            android:paddingTop="3px" 
         android:paddingBottom="3px">     
      <shape>     
         <corners android:radius="10dip" />     
         <gradient    
             android:startColor="#ffffffff"  
             android:centerColor="#ff000000"     
             android:endColor="#ff808A87"    
             android:centerY="0.45"     
             android:angle="270"/>     
      </shape>     
   </item>     
      
   <item android:id="@android:id/progress"
            android:paddingTop="3px" 
         android:paddingBottom="3px" >     
       <clip>     
          <shape>     
              <corners android:radius="10dip" />     
              <gradient    
                  android:startColor="#ffffffff"  
                  android:centerColor="#ffFFFF00"     
                  android:endColor="#ffAABD00"    
                  android:centerY="0.45"     
                  android:angle="270"/>     
          </shape>     
       </clip>     
   </item>     
 </layer-list>

之后再 SeekBar 标签使用如下属性进行引入:其他保持不变

android:progressDrawable="@drawable/seekbar_define_color_style"

执行效果:

下面一个SeekBar是自定义颜色效果

 

由于 SeekBar 的属性 thumb 引入了自定义的 seekbar_thumb.xml 文件,拖动图标是我们自定义的图片:除去这个属性

android:thumb="@drawable/seekbar_thumb"

就回复系统默认状态效果最后效果如下:

拖动按钮系统风格

我们可以通过颜色值再次休息 seekbar_thumb.xml 文件,使拖动按钮设置成自定义颜色:

 

 

 

 

 

 

 

Android seekbar实现可拖动进度条

Android seekbar实现可拖动进度条

本文实例为大家分享了Android seekbar实现可拖动进度条的具体代码,供大家参考,具体内容如下

SeekBar通过滑块的位置来标识数值 允许用户通过拖动滑块来改变进度值的大小

控件:SeekBar
           两个TextView 显示状态

实现SeekBar.OnSeekBarChangeListener接口 对事件进行监听

xml文件:

<?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:orientation="vertical">
 
 <SeekBar
   android:id="@+id/seekBar"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:max="100"
   android:progress="50" />
 
 <TextView
   android:id="@+id/tv1"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
    />
 
 <TextView
   android:id="@+id/tv2"
   android:layout_width="match_parent"
   android:layout_height="wrap_content" />
 
</LinearLayout>

MainActivity:

package com.example.lenovo.seekbar;
 
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.SeekBar;
import android.widget.TextView;
 
public class MainActivity extends Activity implements SeekBar.OnSeekBarChangeListener {
 
  private SeekBar seekBar;
  private TextView tv1;
  private TextView tv2;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv1=findViewById(R.id.tv1);
    tv2=findViewById(R.id.tv2);
    seekBar=findViewById(R.id.seekBar);
    //设置监听器 监听数值改变情况
    seekBar.setOnSeekBarChangeListener(this);
  }
  //数值改变
  @Override
  public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    tv1.setText("正在拖动");
    tv2.setText("当前数值:"+progress);
  }
  //开始拖动
  @Override
  public void onStartTrackingTouch(SeekBar seekBar) {
    tv1.setText("开始拖动");
  }
  //停止拖动
  @Override
  public void onStopTrackingTouch(SeekBar seekBar) {
    tv1.setText("停止拖动");
  }
}

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

您可能感兴趣的文章:
  • Android双向选择控件DoubleSeekBar使用详解
  • Android SeekBar 自定义thumb旋转动画效果
  • Android中SeekBar拖动条使用方法详解
  • Android 自定义SeekBar 实现分段显示不同背景颜色的示例代码
  • Android开发自定义双向SeekBar拖动条控件

android Seekbar沿着seekbar显示进度值

android Seekbar沿着seekbar显示进度值

我有一个带有搜索栏的列表视图,每个搜索栏代表100%的产品价值.通过移动搜索栏,可以更改%值,我想在用户拖动搜索栏时沿搜索栏显示值的变化.我不希望添加另一个用于更新值的文本框.

我更多地是在寻找栏指针上方显示一个小视图的选项,该视图出现在onStartTracking上而消失在onStopTracking事件上.

有没有办法做到这一点?

解决方法:

这是一种简单的方法,

>在XML中添加textView
>通过seekBar的移动更改其位置
>这将使用setX()对其进行定位
>如果您愿意,也可以为其setY()设置其Y位置
>如果要隐藏,请编写一些逻辑,并在需要时使textView Visibility消失.

例:

seekBar.setonSeekBarchangelistener(new SeekBar.OnSeekBarchangelistener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

                    int val = (progress * (seekBar.getWidth() - 2 * seekBar.getThumbOffset())) / seekBar.getMax();
                    textView.setText("" + progress);
                    textView.setX(seekBar.getX() + val + seekBar.getThumbOffset() / 2);
                    //textView.setY(100); just added a value set this properly using screen with height aspect ratio , if you do not set it by default it will be there below seek bar 

                }

或者您可以将Paint与自定义的SeekBar类一起使用,而无需任何TextView

建立课程

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.SeekBar;


public class MySeekBar extends SeekBar {
    public MySeekBar (Context context) {
        super(context);
    }

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

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

    @Override
    protected void onDraw(Canvas c) {
        super.onDraw(c);
        int thumb_x = (int) (( (double)this.getProgress()/this.getMax() ) * (double)this.getWidth());
        float middle = (float) (this.getHeight());

        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        paint.setTextSize(20);
        c.drawText(""+this.getProgress(), thumb_x, middle, paint);
    }
}

在XML中设置/创建SeekBar

  <yourPackageName.MySeekBar
            android:id="@+id/my_seek_bar"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginTop="26dp"
            android:max="10"/>

现在从您的活动

seekBar = (MySeekBar) findViewById(R.id.my_seek_bar);
seekBar.setonSeekBarchangelistener(new SeekBar.OnSeekBarchangelistener() {
    @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
    }
});

今天关于Android自定义垂直拖动seekbar进度条android 拖动条的分享就到这里,希望大家有所收获,若想了解更多关于Android ProgressBar自定义图片进度,自定义渐变色进度条、Android SeekBar 自定义使用图片和颜色显示、Android seekbar实现可拖动进度条、android Seekbar沿着seekbar显示进度值等相关知识,可以在本站进行查询。

本文标签: