Android 视图切换效果
我们先来看看效果图:
上述截图,是手指拖动的效果,如果拖动过屏幕中点,松手后就会自动移动到第二屏。另外,如果使用轻扫手势,也可以自动移动下一屏。
Android中的View有两个子类,Widget和ViewGroup,Widget是可见的窗口组件,比如按钮,ViewGroup就是布局,ViewGroup已经提供了多个布局子类,比如LinearLayout等。
本例中实现了自己的ViewGroup子类。通过覆盖onLayout方法实现对子视图的横向排列布局:
Java代码:
- package eoe. result;
- @Override
- protected void onLayout(boolean changed, int left, int top, int right,
- int bottom) {
- Log.d(TAG, ">>left: " + left + " top: " + top + " right: " + right
- + " bottom:" + bottom);
- /**
- * 设置布局,将子视图顺序横屏排列
- */
- for (int i = 0; i < getChildCount(); i++) {
- View child = getChildAt(i);
- child.setVisibility(View.VISIBLE);
- child.measure(right – left, bottom – top);
- child.layout(0 + i * getWidth(), 0, getWidth() + i * getWidth(),
- getHeight());
通过覆盖computeScroll方法,计算移动屏幕的位移和重新绘制屏幕:
Java代码:
- package eoe. result;
- @Override
- public void computeScroll() {
- if (scroller.computeScrollOffset()) {
- scrollTo(scroller.getCurrX(), 0);
- postInvalidate();
- }
- }
编写了一个名为scrollToScreen的方法,用于根据指定屏幕号切换到该屏幕:
Java代码:
- /**
- * 切换到指定屏
- *
- * @param whichScreen
- */
- public void scrollToScreen(int whichScreen) {
- if (getFocusedChild() != null && whichScreen != currentScreenIndex
- && getFocusedChild() == getChildAt(currentScreenIndex)) {
- getFocusedChild().clearFocus();
- }
- final int delta = whichScreen * getWidth() – getScrollX();
- scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);
- invalidate();
- currentScreenIndex = whichScreen;
- }
snapToDestination方法,是处理当屏幕拖动到一个位置松手后的处理:
Java代码:
- /**
- * 根据当前x坐标位置确定切换到第几屏
- */
- private void snapToDestination() {
- scrollToScreen((getScrollX() + (getWidth() / 2)) / getWidth());
- }
然后说说手势事件的处理。eric的实现,全部使用onTouch事件处理,这样代码不够简明。因为需要记录很多组合手势的历史数据,这样就必须有一些状态位,一些坐标数值。
我用GestureDetector的手势处理事件简化了这方面的处理,只在手势抬起(UP)事件处理中在ouTouchEvent方法中做了处理。
最后更新:2017-04-02 06:51:48