UI组件----SeekBar

项目中最近用到的seekbar来控制地图的缩放级别,但是发现原生的seekbar是横着的

<SeekBar 
           android:layout_marginLeft="@dimen/sport_marginLeft"
             android:id="@android:id/progress"  
         android:layout_width="300dp"  
        android:layout_height="wrap_content"
         android:maxHeight="20dp"  
        android:progressDrawable="@drawable/prograssbar" 

        android:thumb="@drawable/prograssbarthumb" //设置拖动块的样式 在drawable中
         style="?android:attr/progressBarStyleHorizontal" />

设置拖动块样式代码:

 <?xml version="1.0" encoding="utf-8"?>
  <selector xmlns:android="http://schemas.android.com/apk/res/android">

      <!--  滑块未压下时 -->
     <item
         android:state_pressed="false"
          android:drawable="@drawable/thumb_grey"    >     
      </item>

     <!-- 滑块压下时 -->
    <item
        android:state_pressed="true"
         android:drawable="@drawable/thumb_green"    >     
    </item>

 </selector>

这里写图片描述 如图

但是项目中需要实现的是竖着的效果,于是在网上找了一些资料,发现了seekbar竖着的代码,如下:

package com.cn.aecmcd.zdy;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.SeekBar;

public class MySeekBar extends SeekBar{

    public MySeekBar(Context context) {  
        super(context);  
    }  

    public MySeekBar(Context context, AttributeSet attrs, int defStyle) {  
        super(context, attrs, defStyle);  
    }  

    public MySeekBar(Context context, AttributeSet attrs) {  
        super(context, attrs);  
    }  
   //高宽倒置  
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {  
        super.onSizeChanged(h, w, oldh, oldw);  
    }  
  //高宽倒置  
    @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);  
    }  

    @Override  
    public boolean onTouchEvent(MotionEvent event) {  
        if (!isEnabled()) {  
            return false;  
        }  

        switch (event.getAction()) {  
            case MotionEvent.ACTION_DOWN:  
            case MotionEvent.ACTION_MOVE:  
            case MotionEvent.ACTION_UP:  
                setProgress(getMax() - (int) (getMax() * event.getY() / getHeight()));  
                onSizeChanged(getWidth(), getHeight(), 0, 0);  
                break;  

            case MotionEvent.ACTION_CANCEL:  
                break;  
        }  
        return true;  
    }  
}

xml布局文件

<com.cn.aecmcd.zdy.MySeekBar
      android:visibility="gone"
      android:layout_marginLeft="10dp"
      android:layout_centerVertical="true"
      android:layout_gravity="center_vertical"
        android:id="@+id/seekBar_map01"
        android:layout_width="wrap_content"
        android:layout_weight="1"
        android:layout_height="@dimen/map01_seekbar_height"
        android:progressDrawable="@drawable/seekbar_bg"
        android:max="23"
        android:progress="10"


      />

效果如下
这里写图片描述自定义了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:drawable="@drawable/seekar_nomal"/>
    <!-- 中 -->
    <item
        android:id="@android:id/progress"
        android:drawable="@drawable/seekbar_press"/>
    <item
        android:id="@android:id/secondaryProgress"
        android:drawable="@drawable/seekbar_press"/>

</layer-list>

本来以为这样就可以了,但是产品说觉得进度条太宽,让变细一些
于是修改xml布局文件

<com.cn.aecmcd.zdy.MySeekBar
      android:visibility="gone"
      android:layout_marginLeft="10dp"
      android:layout_centerVertical="true"
      android:layout_gravity="center_vertical"
        android:id="@+id/seekBar_map01"
        android:layout_width="20dp"
        android:layout_weight="1"
        android:layout_height="@dimen/map01_seekbar_height"
        android:progressDrawable="@drawable/seekbar_bg"
        android:max="23"
        android:progress="10"
      />

修改了seekbar的宽度 改为20dp,之前是包裹内容
效果如下
这里写图片描述发现拖动块显示不全

于是改为30dp,拖动块倒是能显示全了,如图
这里写图片描述但是还是有些宽
最后自己试了seekbar的一些属性发现 设置width的同时设置一下maxHeight属性就可以了,这样既能保证拖动块显示全,又能设置拖动条的宽度

  android:layout_width="30dp"
   android:maxHeight="5dp"

xml布局代码最终为:

<com.cn.aecmcd.zdy.MySeekBar
      android:visibility="gone"
      android:layout_marginLeft="10dp"
      android:layout_centerVertical="true"
      android:layout_gravity="center_vertical"
        android:id="@+id/seekBar_map01"
        android:layout_width="30dp"
        android:layout_weight="1"
        android:layout_height="@dimen/map01_seekbar_height"
        android:progressDrawable="@drawable/seekbar_bg"
        android:max="23"
        android:progress="10"
        android:maxHeight="5dp"
      />

效果图如下:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值