Android 安卓:设计一个垂直滑块,两个手柄在18到80之间

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

我正在做一个项目,我需要设计两个垂直滑块,如下图所示

我开发的代码在0到100的范围内运行良好。 但我不知道如何将其转换为18到80

这里我添加了我的类和视图XML 感谢您的帮助

下面是我的布局

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>