Android导航菜单与事件分发

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   每个标签的分割线的颜色
    • pstsIndicatorHeightHeight 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 tab
    • pstsTabBackground Background drawable of each tab, should be a StateListDrawable  每个标签的背景,应该是一个StateListDrawable  
    • pstsShouldExpand If set to true, each tab is given the same weight, default false   如果设置为true,每个标签是相同的控件,均匀平分整个屏幕,默认是false
    • pstsTextAllCaps 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了

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值