在Android中实现滑块(SeekBar)

我想实现一个滑块,它基本上是两条线,一条垂直线和一条水平线,穿过触摸屏的地方。 我设法做了一个,但我必须问题:

  1. 滑块不是很光滑,当我移动手指时有一个小的延迟
  2. 如果我放置两个滑块,它不是多点触摸,我想同时使用它们两个

这里是代码:

public class Slider extends View { private Controller controller = new Controller(); private boolean initialisedSlider; private int sliderWidth, sliderHeight; private Point pointStart; private Paint white; private int mode; final static int VERTICAL = 0, HORIZONTAL = 1, BOTH = 2; public Slider(Context context) { super(context); setFocusable(true); // TODO Auto-generated constructor stub } public Slider(Context context, AttributeSet attrs) { super(context, attrs); setFocusable(true); pointStart = new Point(); initialisedSlider = false; mode = Slider.BOTH; } @Override protected void onDraw(Canvas canvas) { if(!initialisedSlider) { initialisedSlider = true; sliderWidth = getMeasuredWidth(); sliderHeight = getMeasuredHeight(); pointStart.x = (int)(sliderWidth/2.0); pointStart.y = (int)(sliderHeight/2.0); controller = new Controller(pointStart, 3); white = new Paint(); white.setColor(0xFFFFFFFF); } canvas.drawLine(controller.getCoordX(),0, controller.getCoordX(),sliderHeight, white); canvas.drawLine(0, controller.getCoordY(), sliderWidth, controller.getCoordY(), white); } public boolean onTouchEvent(MotionEvent event) { int eventaction = event.getAction(); int X = (int)event.getX(); int Y = (int)event.getY(); switch (eventaction) { case MotionEvent.ACTION_DOWN: if(isInBounds(X,Y)) { updateController(X, Y); } break; case MotionEvent.ACTION_MOVE: if(isInBounds(X,Y)) { updateController(X, Y); } break; case MotionEvent.ACTION_UP: if(isInBounds(X,Y)) { updateController(X, Y); } break; } invalidate(); return true; } private boolean isInBounds(int x, int y) { return ((x<=(sliderWidth)) && (x>=(0)) && (y<=(sliderHeight)) && (y>=(0))); } private void updateController(int x, int y) { switch(mode) { case Slider.HORIZONTAL: controller.setCoordX(x); break; case Slider.VERTICAL: controller.setCoordY(y); break; case Slider.BOTH: controller.setCoordX(x); controller.setCoordY(y); break; } } private class Controller { private int coordX, coordY; Controller() { } Controller(Point point, int width) { setCoordX(point.x); setCoordY(point.y); } public void setCoordX(int coordX) { this.coordX = coordX; } public int getCoordX() { return coordX; } public void setCoordY(int coordY) { this.coordY = coordY; } public int getCoordY() { return coordY; } } } 

和XML文件:

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <com.android.lasttest.Slider android:id="@+id/slider" android:layout_width="100dp" android:layout_height="100dp" android:layout_gravity="center_horizontal" android:adjustViewBounds="true"/> <com.android.lasttest.Slider android:id="@+id/slider" android:layout_width="150dp" android:layout_height="150dp" android:layout_gravity="center_horizontal" android:adjustViewBounds="true"/> <com.android.lasttest.Slider android:id="@+id/slider" android:layout_width="200dp" android:layout_height="200dp" android:layout_gravity="center_horizontal" android:adjustViewBounds="true"/> </LinearLayout> 

Solutions Collecting From Web of "在Android中实现滑块(SeekBar)"

如何实现一个SeekBar

在这里输入图像说明

将SeekBar添加到您的布局

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/textView" android:layout_margin="20dp" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <SeekBar android:id="@+id/seekBar" android:max="100" android:progress="50" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> 

笔记

  • max是search栏可以达到的最高值。 默认值是100 。 最小值是0 。 xml min值只能从API 26中获得,但是您可以通过编程方式将0-100范围转换为任何您需要的早期版本。
  • progress是滑块点的起始位置(称为“拇指”)。
  • 对于垂直SeekBar使用android:rotation="270"

听取代码中的更改

 public class MainActivity extends AppCompatActivity { TextView tvProgressLabel; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // set a change listener on the SeekBar SeekBar seekBar = findViewById(R.id.seekBar); seekBar.setOnSeekBarChangeListener(seekBarChangeListener); int progress = seekBar.getProgress(); tvProgressLabel = findViewById(R.id.textView); tvProgressLabel.setText("Progress: " + progress); } SeekBar.OnSeekBarChangeListener seekBarChangeListener = new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { // updated continuously as the user slides the thumb tvProgressLabel.setText("Progress: " + progress); } @Override public void onStartTrackingTouch(SeekBar seekBar) { // called when the user first touches the SeekBar } @Override public void onStopTrackingTouch(SeekBar seekBar) { // called after the user finishes moving the SeekBar } }; } 

笔记

  • 如果您在用户移动onStopTrackingTouch不需要进行任何更新,那么您只需更新onStopTrackingTouch的UI onStopTrackingTouch

也可以看看

  • 在Android Studio中使用示例的SeekBar教程