您的位置:首页 > 移动开发 > Android开发

SeekBar实现滑动上侧滑动显示TextView

2015-04-01 12:36 489 查看
        项目实现过程中,需要实现SeekBar的thumb拖动过程中,seekbar的顶部有一个textview跟随thumb移动,并且显示当前移动的值。先直接上图,实现效果如图所示:



      下面解释实现过程:
       一、自定义seekbar
      (1)、seekbar_pop.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/get_num"
android:gravity="center"
>

<TextView
android:id="@+id/myPop"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:text="100"
/>
</LinearLayout>     (2)、MyPopSeekBar.class
package com.android.wangcp.standline.unit;

import com.android.wangcp.standline.R;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.PopupWindow;
import android.widget.SeekBar;
import android.widget.TextView;

public class MyPopSeekBar extends SeekBar{
//定义变量
private PopupWindow pupWindow;
private LayoutInflater layoutInflater;
private View mView;
//用来表示该组件在整个屏幕内的绝对坐标,其中 mPosition[0] 代表X坐标,mPosition[1] 代表Y坐标。
private int[] mPosition;
//SeekBar上的Thumb的宽度,即那个托动的小黄点的宽度
private final int mThumbWidth = 25;
private TextView mTvProgress;
//构造函数,初始化操作
public MyPopSeekBar(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
//获得父视图对象
layoutInflater = LayoutInflater.from(context);
//获得插入父节点的view对象
mView=layoutInflater.inflate(R.layout.seekbar_pop, null);
mTvProgress=(TextView)mView.findViewById(R.id.tvPop);
pupWindow = new PopupWindow(mView, mView.getWidth(),mView.getHeight(), true);
mPosition = new int[2];
}
public void setSeekBarText(String str){
mTvProgress.setText(str);
}
//重写触发按下监听事件
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
this.getLocationOnScreen(mPosition);
//控件显示位置
pupWindow.showAsDropDown(this, (int) event.getX(),-400);
break;
case MotionEvent.ACTION_UP:
pupWindow.dismiss();
break;
}
return super.onTouchEvent(event);
}
//获得控件的宽度
private int getViewWidth(View v){
int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
v.measure(w, h);
return v.getMeasuredWidth();
}
//获得控件的高度
private int getViewHeight(View v){
int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
v.measure(w, h);
return v.getMeasuredHeight();
}
//重写draw方法
@Override
protected synchronized void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
int thumb_x = this.getProgress() * (this.getWidth() - mThumbWidth)/ this.getMax();
//表示popupwindow在进度条所在y坐标减去popupwindow的高度,再减去他们直接的距离,我设置为5个dip;
int middle = mPosition[1] - getViewHeight(mView);
super.onDraw(canvas);
if (pupWindow != null) {
try {
this.getLocationOnScreen(mPosition);
pupWindow.update(thumb_x+mPosition[0] - getViewWidth(mView) / 2+mThumbWidth/2,
middle,getViewWidth(mView),getViewHeight(mView));

} catch (Exception e) {
// TODO: handle exception
}
}

}
}
        二、调用自定义的seekbar
        (1)、在xml文件中调用

<com.android.wangcp.standline.unit.MyPopSeekBar
android:id="@+id/selectstand_layout04_seekBar01"
android:layout_width="255dip"
android:layout_height="35dip"
android:layout_marginLeft="20dip"
android:layout_below="@+id/selectstand_layout04_text01"
android:layout_marginTop="50dip"
android:progressDrawable="@drawable/bg_progressbar"
android:secondaryProgress="1"
android:thumb="@drawable/bg_progress_thumb" />其中的android:progressDrawable 是自己定义的seekbar的progress样式,android:thumb是自己定义的seekbar上的滑块样式。随附件上传。。。
  (2)、在activity中进行调用
// 当进度条的进度方式变化的时候,就会调用这个方法
// 只要进度条的滑块发生变化,无论滑块是怎样变化的,都会调用此方法
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
selectstand_layout04_seekBar01.setSeekBarText(String.valueOf(progress));
selectstand_layout04_text02.setText(String.valueOf(progress));
}

// 当用户开始滑动滑块的时候,调用此方法
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}

// 当用户停止滑动滑块的时候,调用此方法
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐