在程序中有时候几个控件要放在一起,想随意放在布局上,而且不仅一个布局要使用,此时就想把这几个控件定义成一个新的View就好了,于是就有了下面这个类新的控件类SeekBarGroup.java,SeekBarGroup.java集成了三个View,有两个TextView,一个SeekBar,就是一个显示时间的进度条,这只是一种应用思想,可以是任何View的集合
下面先看下效果,就是一个普通的进度条加两个文本显示,
关键代码
package com.adayome.bddemo.widgets;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.Gravity;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import com.adayome.bddemo.R;
import com.adayome.bddemo.utils.LogUtils;
public class SeekBarGroup extends RelativeLayout {
private static final int tv_start_id = 0x1111111;
private static final int tv_end_id = 0x1111112;
private static final int sb_time_id = 0x1111113;
private SeekBar sbTime;
private TextView tvStart;
private TextView tvEnd;
// 布局参数设置
private RelativeLayout.LayoutParams tvStartLp, tvEndLp, sbTimeLp;
public SeekBarGroup(Context context, AttributeSet attrs) {
super(context, attrs);
setGravity(Gravity.CENTER);
initView(context);
// 用代码直接向布局中添加控件
addView(tvStart, tvStartLp);
addView(tvEnd, tvEndLp);
addView(sbTime, sbTimeLp);
}
private void initView(Context context) {
tvStart = new TextView(context);
tvEnd = new TextView(context);
// 设置每一个控件的布局参数
tvStartLp = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
tvEndLp = new LayoutParams(LayoutParams.WRAP_CONTENT,
LayoutParams.WRAP_CONTENT);
tvStart.setId(tv_start_id);
tvStart.setText("start");
tvEnd.setId(tv_end_id);
tvEnd.setText("end");
// 往布局参数中添加属性
tvStartLp
.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
tvStartLp.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
tvEndLp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
tvEndLp.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
initSeekBar(context);
LogUtils.i("-----initView");
}
private void initSeekBar(Context context) {
sbTime = new SeekBar(context);
sbTimeLp = new LayoutParams(LayoutParams.MATCH_PARENT,
LayoutParams.WRAP_CONTENT);
sbTimeLp.addRule(RelativeLayout.LEFT_OF, tv_end_id);
sbTimeLp.addRule(RelativeLayout.RIGHT_OF, tv_start_id);
sbTimeLp.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);
sbTime.setId(sb_time_id);
sbTime.setMax(100);
sbTime.setProgress(30);
Drawable d = context.getResources().getDrawable(
R.drawable.seekbar_style);
sbTime.setProgressDrawable(d);
Drawable thumb = context.getResources().getDrawable(
R.drawable.seek_thumb_pic);
sbTime.setThumb(thumb);
sbTime.setPadding(15, 0, 15, 0);
sbTime.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
setStart(String.valueOf(progress));
LogUtils.i("onProgressChanged pro = " + progress);
}
});
}
public void setStart(String start) {
tvStart.setText(start);
}
public void setEnd(String end) {
tvEnd.setText(end);
}
public void setProgress(int progress) {
sbTime.setProgress(progress);
}
public int getMax() {
return sbTime.getMax();
}
public interface SeekBarGroupListener {
public void setStart(String start);
public void setEnd(String start);
public void onProgressChanged(int progress, boolean fromUser);
}
}主要跟平常的控件一样使用就可以了,在布局中的定义
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
android:id="@+id/tv_text1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试2" />
android:id="@+id/seekbar_group"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
调用方法package com.adayome.bddemo;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import com.adayome.bddemo.widgets.SeekBarGroup;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
public class Fragment2 extends BaseFragment implements OnClickListener {
private static final String TAG = "Fragment2";
private Random mRan = new Random();
private SeekBarGroup group;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
View v = inflater.inflate(R.layout.fragment_2, container, false);
return initWidgets(v);
}
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行
}
Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == 1) {
group.setProgress(mRan.nextInt(100));
}
super.handleMessage(msg);
};
};
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
// 需要做的事:发送消息
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
private View initWidgets(View v) {
group = (SeekBarGroup) v.findViewById(R.id.seekbar_group);
group.setEnd(String.valueOf(group.getMax()));
return v;
}
}