PagerSlidingTabStrip(viewPage滑动菜单)
1,Include the library
dependencies {
compile 'com.astuetz:pagerslidingtabstrip:1.0.1'
}
2
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" xmlns:app="http://schemas.android.com/apk/res/com.example.viewfragment">
<com.astuetz.PagerSlidingTabStrip
android:id="@+id/tabs"
android:layout_width="match_parent"
android:layout_height="48dip"
app:pstsShouldExpand="true"
/>
<android.support.v4.view.ViewPager
android:id="@+id/viewPager"
android:layout_below="@id/tabs"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
</RelativeLayout>
3,使用和代码设置属性,
private void initView() {
get_record_viewpager = (ViewPager) this
.findViewById(R.id.get_record_viewpager);
get_record_tab = (PagerSlidingTabStrip) this
.findViewById(R.id.get_record_tab);
dm = getResources().getDisplayMetrics();
monthGetRecordFragment = new MonthGetRecordFragment();
totalGetRecordFragment = new TotalGetRecordFragment();
fragmentList.add(monthGetRecordFragment);
fragmentList.add(totalGetRecordFragment);
pagerAdapter = new GetRecordsPagerAdapter(getSupportFragmentManager(),
fragmentList);
get_record_viewpager.setAdapter(pagerAdapter);
get_record_tab.setViewPager(get_record_viewpager);
setTabsValue();
}
/**
* 对PagerSlidingTabStrip的各项属性进行赋值。
*/
private void setTabsValue() {
// 设置Tab是自动填充满屏幕的
get_record_tab.setShouldExpand(true);
// 设置Tab的分割线是透明的
get_record_tab.setDividerColor(Color.TRANSPARENT);
// 设置Tab底部线的高度
get_record_tab.setUnderlineHeight((int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 1, dm));
// 设置Tab Indicator的高度
get_record_tab.setIndicatorHeight((int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 2, dm));
// 设置Tab标题文字的大小
get_record_tab.setTextSize((int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_SP, 15, dm));
// 设置Tab标题默认的颜色
get_record_tab.setTextColor(getResources().getColor(
R.color.get_record_text_unselected_color));
// 设置选中Tab标题的颜色
get_record_tab.setSelectedTextColor(getResources().getColor(
R.color.get_record_text_selected_color));
// 设置Tab底部线的颜色
get_record_tab.setUnderlineColor(getResources().getColor(
R.color.get_record_line_unselected_color));
// 设置Tab Indicator的颜色
get_record_tab.setIndicatorColor(getResources().getColor(
R.color.get_record_line_selected_color));
// 取消点击Tab时的背景色
// get_record_tab.setTabBackground(getResources().getColor(R.color.tab_pressed_hover));
}
或者XMl 中设置属性
个性化设置
为了让你的app不像另一个 Play Store上面的app,你可以添加这些属性来做出自己独具一格的应用。
-
pstsIndicatorColor
Color of the sliding indicator 滑动条的颜色pstsUnderlineColor
Color of the full-width line on the bottom of the view 滑动条所在的那个全宽线的颜色pstsDividerColor
Color of the dividers between tabs 每个标签的分割线的颜色pstsIndicatorHeight
Height of the sliding indicator 滑动条的高度pstsUnderlineHeight
Height of the full-width line on the bottom of the view 滑动条所在的那个全宽线的高度pstsDividerPadding
Top and bottom padding of the dividers 分割线底部和顶部的填充宽度pstsTabPaddingLeftRight
Left and right padding of each tab 每个标签左右填充宽度pstsScrollOffset
Scroll offset of the selected tabpstsTabBackground
Background drawable of each tab, should be a StateListDrawable 每个标签的背景,应该是一个StateListDrawablepstsShouldExpand
If set to true, each tab is given the same weight, default false 如果设置为true,每个标签是相同的控件,均匀平分整个屏幕,默认是falsepstsTextAllCaps
If true, all tab titles will be upper case, default true 如果为true,所有标签都是大写字母,默认为true
GetRecordsPagerAdapter.java
package com.example.viewpagerdemo;
import java.util.List;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
/**
* 类说明:
*
* @author fuyanan
* @date 2015-8-3
* @version 1.0.0
*/
public class GetRecordsPagerAdapter extends FragmentPagerAdapter {
private final String[] titles = { "本月领取", "累积领取" };
private List<Fragment> fragmentLists;
@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
return titles[position];
}
public GetRecordsPagerAdapter(FragmentManager fm,
List<Fragment> fragmentLists) {
super(fm);
this.fragmentLists = fragmentLists;
}
@Override
public Fragment getItem(int position) {
// TODO Auto-generated method stub
return fragmentLists.get(position);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return fragmentLists.size();
}
}
MonthGetRecordFragment.java和TotalGetRecordFragment的代码如下所示
public class MonthGetRecordFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater,
@Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.month_get_record, container, false);
}
}
————————————————
https://blog.csdn.net/wzlyd1/article/details/81104519
一、设置clickable属性会执行intercept 的Move分支,因为这样你的view的onTouchEvent会返回true。代表消费了事件,mFirstTarget 会被赋值,然后mFirstTarget !=null 为true,在下次事件来临的时候,会继续执行onInterceptTouchEVENT
如果没有view消费事件,mfirsttarget会null。下次事件过来就不走onIntercept分支了,直接事件分发,由于没人管这个事件,事件就被冒泡处理了
就设置clickable为true就行了,view的这个属性为true的话,onTouchEvent会直接返回true。这个不算啥问题,我就是好奇没执行move分支而已。或者你让你的子View去消费一下事件,都可以,clickable为true最简单·
事件分发机制 说 是说不明白的,得自己去fuck souce code ,解决几个事件冲突
总结来说就是,只有你的子View说明要消费事件了,那么down move 和up才会走到intecept的分支里面去,如果子View没有消费,那么下次事件来的时候,也就不走intercept了,直接略过,然后分发事件,因为你的子View不处理事件,事件又会被冒泡处理,那么,你Viewgoup的ontouchevent事件将被执行。这也就是为啥说这个的原因
拦截不拦截事件,ontouchevent都会走,onTouchEvent执不执行受两点影响,一个是是否拦截,拦截了,就执行,没毛病。但是不拦截也可能会被执行,因为会被冒泡处理,这要看你的子View有没有处理事件,任玉刚写的伪代码,将intercept 作为ontouchEvent的先决条件了,让我误解了(API26)
二、viewgroup重写了disspatch方法,本方法的onTouchEvent是不会走的. 返回true消耗掉了返回false 事件给父类的onTouch了
在viewgroup中只有disspatch返回super,intercept才会执行.
intercept里面拦截滑动时间,又不拦截点击事件,怎么会影响到子控件的点击事件呢?
down 和 up是不拦截的
move只有在满足滑动条件的时候才拦截
View的点击事件是写在up分支里的,我们并不拦截up
Viewgroup的dispacth方法,如果子View返回false了,那么group也是false了
这个处理指的是冒泡处理,不是被线性处理的
现在的事件分发需要加上nestscroll了