Android 安卓:设计一个垂直滑块,两个手柄在18到80之间
我正在做一个项目,我需要设计两个垂直滑块,如下图所示 我开发的代码在0到100的范围内运行良好。 但我不知道如何将其转换为18到80 这里我添加了我的类和视图XML 感谢您的帮助 下面是我的布局Android 安卓:设计一个垂直滑块,两个手柄在18到80之间,android,android-layout,android-relativelayout,androiddesignsupport,android-designer,Android,Android Layout,Android Relativelayout,Androiddesignsupport,Android Designer,我正在做一个项目,我需要设计两个垂直滑块,如下图所示 我开发的代码在0到100的范围内运行良好。 但我不知道如何将其转换为18到80 这里我添加了我的类和视图XML 感谢您的帮助 下面是我的布局 import android.content.Context; import android.content.res.Resources; import android.content.res.TypedArray; import android.graphics.Color; import andr
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.os.Build;
import android.support.v4.view.ViewCompat;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.RelativeLayout;
import android.widget.TextView;
import wedviser.com.wedviser.R;
/**
* Created by Focaloid on 29-12-2016.
*/
public class RangeBarVerticalAge extends RelativeLayout {
private static final int TOTAL_DIVISION_COUNT = 100;
private static final int MAX_CLICK_DURATION = 200;
public OnRangeBarChangeListener onRangeBarChangeListener;
private int inactiveColor;
private int activeColor;
private double heightParent;
private View viewFilterMain, viewThumbMin, viewThumbMax;
private RelativeLayout relFilterMin, relFilterMax;
private float startYMin, startYMax;
private float movedYMin, movedYMax;
private int initialHeightMin;
private float dTopMin, dTopMax;
private int currentHeightMin, currentHeightMax;
private double resultMin = 0.0;
private double resultMax = 100.0;
private View viewParent;
// private TextView tvFilterMin, tvFilterMax;
private Context context;
private long startClickTime;
private RelativeLayout relativeLayout;
private int minRange = 0, maxRange = 100;
private View viewInActiveTop, viewInActiveBottom;
public RangeBarVerticalAge(Context context) {
super(context);
this.context = context;
initialize(context);
}
public RangeBarVerticalAge(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.RangeBarVerticalAge, 0, 0);
System.out.println(a.getIndexCount());
activeColor = a.getColor(R.styleable.RangeBarVerticalAge_activeColor, Color.parseColor("#007FFF"));
inactiveColor = a.getColor(R.styleable.RangeBarVerticalAge_inactiveColor, Color.parseColor("#808080"));
a.recycle();
initialize(context);
}
public RangeBarVerticalAge(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
initialize(context);
}
public static float convertDpToPixel(float dp, Context context) {
Resources resources = context.getResources();
DisplayMetrics metrics = resources.getDisplayMetrics();
return dp * ((float) metrics.densityDpi / DisplayMetrics.DENSITY_DEFAULT);
}
private void initialize(Context context) {
inflate(context, R.layout.rangebar_age, this);
onRangeBarChangeListener = (OnRangeBarChangeListener) context;
onRangeBarChangeListener.onRangeBarChangeAge((int) resultMin, (int) resultMax);
relativeLayout = (RelativeLayout) findViewById(R.id.rel_main);
// tvFilterMin = (TextView) findViewById(R.id.tv_filter_min);
//tvFilterMax = (TextView) findViewById(R.id.tv_filter_max);
relFilterMin = (RelativeLayout) findViewById(R.id.rel_filter_min);
relFilterMax = (RelativeLayout) findViewById(R.id.rel_filter_max);
viewThumbMax = findViewById(R.id.oval_thumb_max);
viewThumbMin = findViewById(R.id.oval_thumb_min);
viewFilterMain = findViewById(R.id.filter_main_view);
viewParent = findViewById(R.id.view_filter_parent);
viewInActiveTop = findViewById(R.id.view_inactive_line_top);
viewInActiveBottom = findViewById(R.id.view_inactive_line_bottom);
init();
relFilterMin.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startYMin = event.getRawY();
// startClickTime = Calendar.getInstance().getTimeInMillis();
break;
case MotionEvent.ACTION_UP: {
// long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime;
// if (clickDuration < MAX_CLICK_DURATION) {
// //Click event triggered
//
// }
break;
}
case MotionEvent.ACTION_MOVE:
movedYMin = event.getRawY() - startYMin;
startYMin = event.getRawY();
if (v.getHeight() + movedYMin <= initialHeightMin || dTopMin + v.getHeight() + movedYMin >= dTopMax) {
currentHeightMin = v.getHeight();
getResultMin();
break;
}
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
layoutParams.height += movedYMin;
v.setLayoutParams(layoutParams);
dTopMin = v.getY();
currentHeightMin = v.getHeight();
getResultMin();
break;
default:
return false;
}
return true;
}
});
relFilterMax.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startYMax = event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
movedYMax = event.getRawY() - startYMax;
startYMax = event.getRawY();
if (v.getHeight() - movedYMax <= initialHeightMin || v.getY() + movedYMax <= currentHeightMin + dTopMin) {
currentHeightMax = v.getHeight();
getResultMax();
break;
}
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
layoutParams.height -= movedYMax;
v.setLayoutParams(layoutParams);
dTopMax = v.getY();
currentHeightMax = v.getHeight();
getResultMax();
break;
default:
return false;
}
return true;
}
});
}
private void init() {
// ViewCompat.setElevation(tvFilterMin, 100f);
viewFilterMain.setBackgroundColor(activeColor);
viewInActiveBottom.setBackgroundColor(inactiveColor);
viewInActiveTop.setBackgroundColor(inactiveColor);
initialHeightMin = (int) convertDpToPixel(30, context);
final ViewTreeObserver viewTreeObserver = relativeLayout.getViewTreeObserver();
// if (viewTreeObserver.isAlive())
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
viewParent.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
viewParent.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
dTopMin = relFilterMin.getY();
dTopMax = relFilterMax.getY();
currentHeightMin = relFilterMin.getHeight();
System.out.println("viewParentGetHeight:" + viewParent.getHeight());
heightParent = viewParent.getHeight() - 2 * initialHeightMin;
}
});
}
public void getResultMin() {
//Max
resultMin = Math.floor(100 * (Math.abs(currentHeightMin - initialHeightMin)) / heightParent);
//tvFilterMin.setText((int) resultMin + "");
onRangeBarChangeListener.onRangeBarChangeAge((int) resultMin, (int) resultMax);
}
public void getResultMax() {
resultMax = Math.floor(100 * (Math.abs(currentHeightMax - initialHeightMin)) / heightParent);
resultMax = Math.abs(resultMax - 100);
//tvFilterMax.setText(((int) resultMax + ""));
onRangeBarChangeListener.onRangeBarChangeAge((int) resultMin, (int) resultMax);
}
public int getMinimumProgress() {
return (int) resultMin;
}
public void setMinimumProgress(final int minProgress) {
if (minProgress >= 0 && minProgress < 100 && minProgress < resultMax) {
resultMin = minProgress;
viewParent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
viewParent.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
viewParent.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
currentHeightMin = ((minProgress * (viewParent.getHeight() - 2 * initialHeightMin) / 100) + initialHeightMin);
ViewGroup.LayoutParams layoutParams = relFilterMin.getLayoutParams();
layoutParams.height = currentHeightMin;
relFilterMin.setLayoutParams(layoutParams);
}
});
//tvFilterMin.setText((int) resultMin + "");
onRangeBarChangeListener.onRangeBarChangeAge((int) resultMin, (int) resultMax);
}
}
public int getMaximumProgress() {
return (int) resultMax;
}
public void setMaximumProgress(final int maxProgress) {
if (maxProgress >= 0 && maxProgress <= 100 && maxProgress > resultMin) {
resultMax = maxProgress;
viewParent.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
viewParent.getViewTreeObserver().removeOnGlobalLayoutListener(this);
} else {
viewParent.getViewTreeObserver().removeGlobalOnLayoutListener(this);
}
currentHeightMax = ((Math.abs(maxProgress - 100) * (viewParent.getHeight() - 2 * initialHeightMin) / 100) + initialHeightMin);
ViewGroup.LayoutParams layoutParams = relFilterMax.getLayoutParams();
layoutParams.height = currentHeightMax;
relFilterMax.setLayoutParams(layoutParams);
}
});
// tvFilterMax.setText((int) resultMax + "");
onRangeBarChangeListener.onRangeBarChangeAge((int) resultMin, (int) resultMax);
}
}
public interface OnRangeBarChangeListener {
void onRangeBarChangeAge(int min, int max);
}
}
导入android.content.Context;
导入android.content.res.Resources;
导入android.content.res.TypedArray;
导入android.graphics.Color;
导入android.os.Build;
导入android.support.v4.view.ViewCompat;
导入android.util.AttributeSet;
导入android.util.DisplayMetrics;
导入android.view.MotionEvent;
导入android.view.view;
导入android.view.ViewGroup;
导入android.view.ViewTreeObserver;
导入android.widget.RelativeLayout;
导入android.widget.TextView;
导入wedviser.com.wedviser.R;
/**
*Focaloid于2016年12月29日创建。
*/
公共类RangeBarVerticalAge扩展了RelativeLayout{
私有静态最终整数总除法计数=100;
私有静态最终整数最大点击持续时间=200;
公共OnRangeBarChangeListener OnRangeBarChangeListener;
私有彩色;
私有int-activeColor;
私人双高父母;
私有视图viewFilterMain、viewThumbMin、viewThumbMax;
私有相对物yout relFilterMin、relFilterMax;
私人浮动startYMin,startYMax;
私有浮动movedYMin、movedYMax;
私有int initialHeightMin;
专用浮点dTopMin、dTopMax;
私有int currentHeightMin、currentHeightMax;
私有双resultMin=0.0;
私有双结果最大值=100.0;
私有视图视图父视图;
//私有文本视图tvFilterMin,tvFilterMax;
私人语境;
私人长启动时间;
私人亲戚;
私有int最小范围=0,最大范围=100;
私有视图viewInActiveTop、VIEWINACTIVETOM;
公共RangeBarVerticalAge(上下文){
超级(上下文);
this.context=上下文;
初始化(上下文);
}
公共RangeBarVerticalAge(上下文、属性集属性){
超级(上下文,attrs);
this.context=上下文;
TypedArray a=上下文。获取样式属性(attrs,R.styleable.RangeBarVerticalAge,0,0);
System.out.println(a.getIndexCount());
activeColor=a.getColor(R.styleable.RangeBarVerticalAge_activeColor,Color.parseColor(“#007FFF”);
inactiveColor=a.getColor(R.styleable.RangeBarVerticalAge_inactiveColor,Color.parseColor(“#808080”);
a、 回收();
初始化(上下文);
}
公共RangeBarVerticalAge(上下文上下文、属性集属性、int defStyleAttr){
super(上下文、attrs、defStyleAttr);
this.context=上下文;
初始化(上下文);
}
公共静态浮点convertDpToPixel(浮点dp,上下文){
Resources=context.getResources();
DisplayMetrics=resources.getDisplayMetrics();
返回dp*((float)metrics.densityDpi/DisplayMetrics.DENSITY\u默认值);
}
私有void初始化(上下文){
充气(上下文、右布局、范围栏、本);
onRangeBarChangeListener=(onRangeBarChangeListener)上下文;
onRangeBarChangeListener.onRangeBarChangeAge((int)resultMin,(int)resultMax);
relativeLayout=(relativeLayout)findViewById(R.id.rel_main);
//tvFilterMin=(TextView)findViewById(R.id.tv\u filter\u min);
//tvFilterMax=(TextView)findViewById(R.id.tv\u filter\u max);
relFilterMin=(RelativeLayout)findViewById(R.id.rel\u filter\u min);
relFilterMax=(RelativeLayout)findViewById(R.id.rel\u filter\u max);
viewThumbMax=findViewById(R.id.oval\u thumb\u max);
viewThumbMin=findViewById(R.id.oval\u thumb\u min);
viewFilterMain=findViewById(R.id.filter\u main\u视图);
viewParent=findViewById(R.id.view\u filter\u parent);
viewInActiveTop=findViewById(R.id.view\U inactive\U line\U top);
viewInActiveBottom=findViewById(R.id.view\u inactive\u line\u bottom);
init();
setOnTouchListener(新的OnTouchListener(){
公共布尔onTouch(视图v,运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
startYMin=event.getRawY();
//startClickTime=Calendar.getInstance().getTimeInMillis();
打破
case MotionEvent.ACTION\u UP:{
//long clickDuration=Calendar.getInstance().getTimeInMillis()-startClickTime;
//如果(点击持续时间<最大点击持续时间){
////单击事件触发
//
// }
打破
}
case MotionEvent.ACTION\u移动:
movedYMin=event.getRawY()-startYMin;
startYMin=event.getRawY();
如果(v.getHeight()+movedYMin=dTopMax){
currentHeightMin=v.getHeight();
getResultMin();
打破
}
ViewGroup.LayoutParams LayoutParams=v.getLayoutParams();
layoutParams.height+=movedYMin;
v、 setLayoutParams(layoutParams);
dTopMin=v.getY();
currentHeightMin=v.getHeight();
getResultMin();
打破
违约:
返回false;
}
返回true;
}
});
setOnTouchListener(新的OnTouchListener(){
公共布尔onTouch(视图v,运动事件){
开关(event.getAction()){
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/rel_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:orientation="vertical"
android:animateLayoutChanges="true"
>
<View
android:id="@+id/view_filter_parent"
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@android:color/transparent"
android:clickable="false" />
<View
android:id="@+id/filter_main_view"
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_centerInParent="true"
android:layout_marginBottom="20dp"
android:layout_alignRight="@+id/rel_filter_min"
android:layout_alignEnd="@+id/rel_filter_min"
android:layout_marginRight="11dp"
android:layout_marginEnd="11dp"
android:background="#2196f3" />
<RelativeLayout
android:id="@+id/rel_filter_min"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_gravity="bottom"
>
<RelativeLayout
android:id="@+id/rel_filter_min_text"
android:layout_alignParentBottom="true"
android:layout_marginEnd="10dp"
android:layout_marginRight="10dp"
android:background="@android:color/transparent"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></RelativeLayout>
<View
android:id="@+id/view_inactive_line_top"
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_marginTop="5dp"
android:layout_alignLeft="@+id/oval_thumb_min"
android:layout_alignStart="@+id/oval_thumb_min"
android:layout_marginLeft="8.5dp"
android:layout_marginStart="8.5dp"
android:layout_marginBottom="10dp"
android:background="#808080" />
<View
android:id="@+id/oval_thumb_min"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_toRightOf="@+id/rel_filter_min_text"
android:layout_toEndOf="@+id/rel_filter_min_text"
android:layout_centerInParent="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="4dp"
android:background="@drawable/oval_shape"
/>
</RelativeLayout>
<RelativeLayout
android:id="@+id/rel_filter_max"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:layout_alignLeft="@+id/filter_main_view"
android:layout_alignParentBottom="true"
android:layout_alignStart="@+id/filter_main_view"
android:layout_gravity="bottom"
android:layout_marginLeft="-11dp"
android:layout_marginStart="-11dp">
<View
android:id="@+id/view_inactive_line_bottom"
android:layout_width="2dp"
android:layout_height="match_parent"
android:layout_marginBottom="10dp"
android:layout_marginLeft="10.5dp"
android:layout_marginStart="10.5dp"
android:layout_marginTop="15dp"
android:background="#808080" />
<View
android:id="@+id/oval_thumb_max"
android:layout_width="22dp"
android:layout_height="22dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:background="@drawable/oval_shape"
/>
</RelativeLayout>
</RelativeLayout>