一、效果图片
二、资源文件
在drawable资源文件夹创建:
1.seekbar_style.xml (可在此更改SeekBar背景长短粗细颜色)
<?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:gravity="center_vertical|fill_horizontal"> <shape android:shape="rectangle"> <size android:height="4dp" /> <solid android:color="#33505C63" /> <corners android:radius="2dp" /> </shape> </item> <item android:id="@android:id/progress" android:gravity="center_vertical|fill_horizontal"> <scale android:scaleWidth="100%"> <shape android:shape="rectangle"> <size android:height="4dp" /> <gradient android:angle="0" android:endColor="#FF4797D2" android:startColor="#FF22425D" /> <corners android:radius="2dp" /> </shape> </scale> </item> </layer-list>
2.ver_thumb.xml (可在此更改SeekBar的thumb样式)
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> <!-- 宽和高>=轨道高,若此处的宽和高==track的高则圆圈与轨道一样大,类似苹果switch样式 --> <size android:width="15dp" android:height="10dp" /> <gradient android:centerX="0.5" android:centerY="0.5" android:angle="1" android:endColor="#7B7B9B" android:gradientRadius="40px" android:startColor="#B9B9B9" android:type="linear" /> <corners android:radius="5dp" /> <stroke android:width="1dp" android:color="#FFB2ADAD" /> </shape>
三、布局
1.activity_main.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="horizontal"> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="50dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:gravity="center" android:text="自定义\n装饰背景" /> <com.rivotek.VerticalSeekBar android:id="@+id/seekbar_decor" android:layout_width="wrap_content" android:layout_height="150dp" android:layout_gravity="center_horizontal" android:progressDrawable="@drawable/seekbar_style" android:thumb="@drawable/ver_thumb" /> </LinearLayout> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="50dp" android:orientation="vertical"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:gravity="center" android:text="android 原生\nSeekBar装饰" /> <com.rivotek.VerticalSeekBar android:id="@+id/seekbar_normal" android:layout_width="wrap_content" android:layout_height="150dp" android:layout_gravity="center_horizontal" /> </LinearLayout> </LinearLayout>
四、Java代码
1.MainActivity.java
package com.ben; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.widget.SeekBar; public class MainActivity extends AppCompatActivity { private static final String TAG = "LXP_MainActivity"; VerticalSeekBar seek1,seek2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); seek1 = findViewById(R.id.seekbar_decor); seek2 = findViewById(R.id.seekbar_normal); seek1.setMin(1); seek1.setMax(100); seek2.setMin(10); seek2.setMax(1000); seek1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { Log.i(TAG,"seek1 progress = " + progress); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); seek2.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { Log.i(TAG,"seek2 progress = " + progress); } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onStopTrackingTouch(SeekBar seekBar) { } }); } }
2.VerticalSeekBar.java
package com.ben; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.SeekBar; @SuppressLint("AppCompatCustomView") public class VerticalSeekBar extends SeekBar { private StartAndStopListener startAndStopListener; public VerticalSeekBar(Context context) { super(context); } public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public VerticalSeekBar(Context context, AttributeSet attrs) { super(context, attrs); } protected void onSizeChanged(int w, int h, int oldW, int oldH) { super.onSizeChanged(h, w, oldW, oldH); } @Override protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(heightMeasureSpec, widthMeasureSpec); setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); } protected void onDraw(Canvas c) { c.rotate(-90); c.translate(-getHeight(), 0); super.onDraw(c); } @Override public synchronized void setProgress(int progress) { super.setProgress(progress); onSizeChanged(getWidth(), getHeight(), 0, 0); } @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent event) { if (!isEnabled()) { return false; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (startAndStopListener != null) { startAndStopListener.startChange(this); } case MotionEvent.ACTION_MOVE: setProgress((int) (getMax() - (getMax() * event.getY() / getHeight()))); break; case MotionEvent.ACTION_UP: if (startAndStopListener != null) { startAndStopListener.stopChange(this,getProgress()); } break; default: return super.onTouchEvent(event); } return true; } public void setStartAndStopListener(StartAndStopListener startAndStopListener) { this.startAndStopListener = startAndStopListener; } public interface StartAndStopListener { void startChange(VerticalSeekBar seekBar); void stopChange(VerticalSeekBar seekBar, int progress); } }
结语:
完成以上就可以使用啦!点赞关注我,之后持续给大家带来更多的有关Android初级的内容。