Android滑动标签和viewPager结合使用
来源:互联网 发布:linux 数据库 编辑:程序博客网 时间:2024/06/05 14:43
最近做一个需求,类似新闻标签横向滑动和内容切换,当内容区左右滑动时标签需要切换到对应的标题上,设置标题对应样式变化;当标签滑动并选中时,内容要相应变化。
大致思路:横向滑动使用自定义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;
/**
* 有监听事件的横向滑动
* Created by tina on 16/10/9.
*/
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); }};@Overridepublic 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;}
}
工具类
/**
* dp 和 px转换
*/
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);}
}
- Android滑动标签和viewPager结合使用
- android ViewPager和FragmentPagerAdapter结合使用
- Android 使用ViewPager和RadioGroup配合Fragment实现标签页,可点击按钮切换、滑动切换。
- Android 开源框架ViewPageIndicator(标签指示器)结合ViewPager使用
- Android Tablayout 结合ViewPager实现滑动界面
- ViewPager 和 GridView 结合实现左右滑动
- Android - Fragment+ViewPager结合使用
- 自由控制TabLayout和ViewPager结合使用时是否可以点击和滑动
- Android ViewPager + Fragment 实现滑动标签效果
- Android viewpager+fragment 自定义滑动标签
- Android ViewPager + Fragment 自定义滑动标签
- TabLayout和ViewPager结合使用
- ViewPager 、TabLayout和Fragment实现标签滑动
- Android开发之Viewpager与TextView结合使用时不能滑动的问题
- Android中TabLayout和ViewPager的结合使用
- Android中TabLayout和ViewPager的结合使用
- 自学android笔记之TabLayout结合ViewPager和Fragment实现多页面滑动
- ViewPager和Fragment结合使用,可以做出顶部导航界面滑动效果
- 关键字-分节6(if、else 组合,bool,float及指针)
- Android-省市区三级联动
- linux文件3
- js获取屏幕
- dojo:animation
- Android滑动标签和viewPager结合使用
- 视频直播的实现
- 学习C++ -> 类(Classes)的定义与实现
- CSU 1632 最长公共前缀(出现超过两次的不同子串有多少个)
- 聊斋(storys)
- VtkCamera使用原理及小结
- 不错的css按钮移过效果
- 智慧北京项目第一天
- 关键字-分节7(switch、case)