周记4

1. 使用TabLayout + ViewPager

布局

    <com.google.android.material.tabs.TabLayout
        android:id="@+id/invest_tablayout"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:paddingTop="20dp"
        android:background="@color/color_white"
        app:tabIndicatorColor="@color/colorPrimary"
        app:tabIndicatorFullWidth="false"
        app:tabSelectedTextColor="@color/colorPrimary"
        app:tabTextAppearance="@style/tab_text_size" />

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/invest_viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </androidx.viewpager.widget.ViewPager>

使用

        mFragments.clear();
        investTablayout.removeAllTabs();
        String[] arr = getResources().getStringArray(R.array.tab);
        mFragments.add(new PersonListFragment());
        mFragments.add(new PersonAddFragment());
        mFragments.add(new PersonFindFragment());
        for (int i = 0; i < arr.length; i++) {
            investTablayout.addTab(investTablayout.newTab());
        }
        investTablayout.setupWithViewPager(investViewpager, false);
        mainViewPagerAdapter = new MainViewPagerAdapter(getSupportFragmentManager(), mFragments);
        investViewpager.setAdapter(mainViewPagerAdapter);
        for (int i = 0; i < arr.length; i++) {
            investTablayout.getTabAt(i).setText(arr[i]);
        }

adapter

public class MainViewPagerAdapter extends FragmentPagerAdapter {
    private List<BaseFragment> mFragments;

    public MainViewPagerAdapter(FragmentManager fm, List<BaseFragment> cmFragments) {
        super(fm);
        mFragments = cmFragments;
    }

    @Override
    public Fragment getItem(int i) {
        return mFragments.get(i);
    }

    @Override
    public int getCount() {
        return mFragments.size();
    }
}

2. 查询显示动态列表

这周还做了一个人员信息查询功能,按照输入的字符来动态更新列表

fpfFindEt.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {

            }

            @Override
            public void afterTextChanged(Editable editable) {
                if (editable.length() == 0) {
                    fpfFindClear.setVisibility(View.INVISIBLE);
                } else {
                    fpfFindClear.setVisibility(View.VISIBLE);
                }
                handler.post(runnable);
            }
        });

3. 学习了一个弹性的自定义ScrollerView

public class ReboundScrollView extends ScrollView {

    @SuppressWarnings("unused")
    private static final String TAG = "ReboundScrollView";
    //移动的延迟距离因子,手如果滑动100 ,实际滑动60
    private static final float MOVE_FACTOR = 0.6f;
    //动画执行的时间,也就是恢复正常的时间
    private static final int ANIM_TIME = 400;
    //ScrollView的唯一子view
    private View contentView;
    //手指触摸起始y坐标
    private float startY;
    //用来保存原始位置
    private Rect originalRect = new Rect();
    //表示是否正在移动
    private boolean isMoved = false;

    public ReboundScrollView(Context context) {
        super(context);
    }

    public ReboundScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ReboundScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * descirption: 当我们的XML布局被加载完后,就会回调onFinshInfalte这个方法,在这个方法中我们可以初始化控件和数据。
     */
    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        if (getChildCount() > 0) {
            contentView = getChildAt(0);
        }
    }

    /**
     * descirption: 在测量完成之后,布局的时候调用此方法,去保存原始位置
     */
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        if (contentView == null)
            return;
        //保存原始位置
        originalRect.set(contentView.getLeft(), contentView.getTop(), contentView.getRight(), contentView.getBottom());
    }


    /**
     * descirption: 事件分发的方法
     */
    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (contentView == null) {
            return super.dispatchTouchEvent(ev);
        }
        int action = ev.getAction();
        switch (action) {
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "dispatchTouchEvent: ACTION_DOWN");
                startY = ev.getY();
                break;
            case MotionEvent.ACTION_MOVE:
                Log.d(TAG, "dispatchTouchEvent: ACTION_MOVE");
                if (!isCanPullDown() && !isCanPullUp()) {
                    startY = ev.getY();
                    break;
                }
                float nowY = ev.getY();
                int deltaY = (int) (nowY - startY);
                boolean shouldMove = (isCanPullDown() && deltaY > 0)
                        || (isCanPullUp() && deltaY < 0)
                        || (isCanPullDown() && isCanPullUp());
                if (shouldMove) {
                    int offset = (int) (deltaY * MOVE_FACTOR);
                    contentView.layout(originalRect.left, originalRect.top + offset, originalRect.right,
                            originalRect.bottom + offset);
                    isMoved = true;
                }
                break;
            case MotionEvent.ACTION_UP: //松手就恢复原来的位置\
                Log.d(TAG, "dispatchTouchEvent: ACTION_UP");
                if (!isMoved)
                    break;
                TranslateAnimation anim = new TranslateAnimation(0, 0, contentView.getTop(), originalRect.top);
                anim.setDuration(ANIM_TIME);
                anim.setInterpolator(new DecelerateInterpolator());
                contentView.startAnimation(anim);
                contentView.layout(originalRect.left, originalRect.top, originalRect.right, originalRect.bottom);
                isMoved = false;
                break;
            default:
                break;
        }
        return super.dispatchTouchEvent(ev);
    }

    private boolean isCanPullDown() {
        return getScrollY() == 0 || contentView.getHeight() <= getHeight() + getScrollY();
    }

    private boolean isCanPullUp() {
        return contentView.getHeight() <= getHeight() + getScrollY();
    }
}
 
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值