将定义水平seekbar旋转-90度, 直接上代码
package com.android.systemui.statusbar.car.hvac;
import android.widget.SeekBar;
import android.content.Context;
import android.graphics.Canvas;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.annotation.SuppressLint;
import android.content.res.TypedArray;
import android.util.Log;
import com.android.systemui.R;
import com.android.systemui.Dependency;
public class CarVerticalSeekBar extends SeekBar implements HvacSeekBar, HvacComponent {
private static final String TAG = "CarVerticalSeekBar";
private static final boolean DEBUG = true;
private OnSeekBarChangeListener mOnSeekBarChangeListener;
private final int mAreaId;
private final int mPropertyId;
private final int mHvacOffset;
private final int mLastPostion;
public CarVerticalSeekBar(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CarVerticalSeekBar);
try {
mAreaId = typedArray.getInt(R.styleable.CarVerticalSeekBar_hvacAreaId, -1);
mPropertyId = typedArray.getInt(R.styleable.CarVerticalSeekBar_hvacPropertyId, -1);
mHvacOffset = typedArray.getInt(R.styleable.CarVerticalSeekBar_hvacOffset, -1);
} finally {
typedArray.recycle();
}
if (DEBUG) {
Log.i(TAG, "mAreaId :" + mAreaId);
Log.i(TAG, "mPropertyId :" + mPropertyId);
}
// register with controller
HvacController hvacController = Dependency.get(HvacController.class);
hvacController.addHvacView(this, true);
mLastPostion = getProgress();
}
@Override
protected void onDraw(Canvas canvas) {
canvas.rotate(-90);
canvas.translate(-getHeight(), 0);
super.onDraw(canvas);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int width = getMeasuredHeight();
int height = getMeasuredWidth();
setMeasuredDimension(width, height);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(h, w, oldh, oldw);
}
public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {
mOnSeekBarChangeListener = l;
}
private void onStartTrackingTouch() {
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onStartTrackingTouch(this);
}
}
private void onStopTrackingTouch() {
if (mOnSeekBarChangeListener != null) {
mOnSeekBarChangeListener.onStopTrackingTouch(this);
}
}
private void onProgressChanged() {
if (mOnSeekBarChangeListener != null) {
int progress = getProgress();
//Log.i("tag", "yong onProgressChanged ACTION_MOVE");
mOnSeekBarChangeListener.onProgressChanged(this, progress, false);
}
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
if (!isEnabled()) return false;
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
setPressed(true);
onStartTrackingTouch();
break;
case MotionEvent.ACTION_MOVE:
onProgressChanged();
int progress = getMax() - (int) (getMax() * event.getY() / getHeight());
setProgress(progress);
onSizeChanged(getWidth(), getHeight(), 0, 0);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
onStopTrackingTouch();
setPressed(false);
break;
}
return true;
}
@Override
public int getPropertyId() {
return mPropertyId;
}
@Override
public int getAreaId() {
return mAreaId;
}
@Override
public void setTemp(float temp) {
if(DEBUG) {
Log.i(TAG, "setTemp temp: " + temp);
}
int value = ((int)temp) - mHvacOffset;
setProgress((int)value);
}
@Override
public float getTemp() {
return 0;
}
public int getHvacOffset(){
return mHvacOffset;
}
}
xml中引用
<com.android.systemui.statusbar.car.hvac.CarVerticalSeekBar
android:id="@+id/navi_seek"
android:layout_width="320dp"
android:layout_height="80dp"
android:layout_marginTop="-5dp"
android:min="0"
android:max="16"
systemui:hvacOffset="16"
android:progressDrawable="@drawable/seekbar_bg"
systemui:hvacAreaId="49"
systemui:hvacPropertyId="358614275"
android:splitTrack="false"
android:background="@null"
android:maxHeight="70dp"
android:thumb="@drawable/systemui_slider_label_80x30"/>
这里遇到一个问题,在拖动滑块时,会再水平方向上多出一个灰色圆形小球。
添加下面配置修正,android:splitTrack="false"
这个说是修改滑块透明度的,未验证
android:background="@null"
android:splitTrack="false"