最近做一个需求,类似新闻标签横向滑动和内容切换,当内容区左右滑动时标签需要切换到对应的标题上,设置标题对应样式变化;当标签滑动并选中时,内容要相应变化。
大致思路:横向滑动使用自定义Horizontalscrollview为了添加滑动监听事件,滑动时获取滑动的位置,内容切换使用viewpager。
将标签TextView添加到自定义Horizontalscrollview中,并将对应的fragment加入viewpager中
//根据标签的个数设置tab和fragment
for(int i = 0 ; i < postChannelBeens.size(); i++){
String name = postChannelBeens.get(i).getName();//标签名
TextView tv = new TextView(mActivity);
tv.setId(i);
tv.setText(name);
tv.setTag(name);
tv.setTextColor(getResources().getColor(R.color.tv_color_gray));
tv.setBackgroundResource(R.drawable.shape_gray_12_bg);
tv.setTextSize(14);
tv.setPadding(DensityUtil.dip2px(mActivity, 12),DensityUtil.dip2px(mActivity, 2),DensityUtil.dip2px(mActivity, 12),DensityUtil.dip2px(mActivity, 2));//设置间距默认为px,用工具类将dp转为px
tv.setSingleLine();
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
if(i != 0 ){
lp.setMargins(DensityUtil.dip2px(mActivity, 12),0,0,0);//设置TextView之间的距离
}
tv.setLayoutParams(lp);
final int position = i;
tv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {//点击tab时,切换到对应的fragment
Message msg = new Message();
msg.what = 1;
msg.arg1 = position;
mHandler.sendMessage(msg);
}
});
ll_post_channel.addView(tv);//添加到横向滑动控件中
CommunityHotFragment fragment = new CommunityHotFragment();//新添对应的fragment
fragment.setmParam1(postChannelBeens.get(i).getPost_channel_id());//设置不同的参数
fragments.add(fragment);//加入列表中
}
下面是自定义有监听事件的横向滑动
import android.content.Context;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.HorizontalScrollView;
public class MyHorizontalscrollview extends HorizontalScrollView {
public MyHorizontalscrollview(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyHorizontalscrollview(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyHorizontalscrollview(Context context) {
super(context);
}
public interface ScrollViewListener {
void onScrollChanged(ScrollType scrollType);
}
private Handler mHandler;
private ScrollViewListener scrollViewListener;
/**
* 滚动状态 IDLE 滚动停止 TOUCH_SCROLL 手指拖动滚动 FLING滚动
*/
public enum ScrollType{IDLE,TOUCH_SCROLL,FLING};
/**
* 记录当前滚动的距离
*/
private int currentX = -9999999;
/**
* 当前滚动状态
*/
private ScrollType scrollType = ScrollType.IDLE;
/**
* 滚动监听间隔
*/
private int scrollDealy = 50;
/**
* 滚动监听runnable
*/
private Runnable scrollRunnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
if(getScrollX()==currentX){
//滚动停止 取消监听线程
scrollType = ScrollType.IDLE;
if(scrollViewListener!=null){
scrollViewListener.onScrollChanged(scrollType);
}
mHandler.removeCallbacks(this);
return;
}else{
//手指离开屏幕 view还在滚动的时候
scrollType = ScrollType.FLING;
if(scrollViewListener!=null){
scrollViewListener.onScrollChanged(scrollType);
}
}
currentX = getScrollX();
mHandler.postDelayed(this, scrollDealy);
}
};
@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
this.scrollType = ScrollType.TOUCH_SCROLL;
scrollViewListener.onScrollChanged(scrollType);
//手指在上面移动的时候 取消滚动监听线程
mHandler.removeCallbacks(scrollRunnable);
break;
case MotionEvent.ACTION_UP:
//手指移动的时候
mHandler.post(scrollRunnable);
break;
}
return super.onTouchEvent(ev);
}
/**
* 必须先调用这个方法设置Handler 不然会出错
*/
public void setHandler(Handler handler){
this.mHandler = handler;
}
/**
* 设置滚动监听
*/
public void setOnScrollStateChangedListener(ScrollViewListener listener){
this.scrollViewListener = listener;
}
}
工具类
public class DensityUtil {
/**
* 根据手机的分辨率从 dp 的单位 转成为 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 根据手机的分辨率从 px(像素) 的单位 转成为 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
}