国产化驱动经济自主性与科技创新的未来之路
822
2022-12-01
Android 视图切换效果
我们先来看看效果图:
上述截图,是手指拖动的效果,如果拖动过屏幕中点,松手后就会自动移动到第二屏。另外,如果使用轻扫手势,也可以自动移动下一屏。
Android中的
View有两个子类,
Widget和
ViewGroup,
Widget是可见的窗口组件,比如按钮,
ViewGroup就是布局,
ViewGroup已经提供了多个布局子类,比如
LinearLayout等。
本例中实现了自己的
ViewGroup子类。通过覆盖
onLayout方法实现对子视图的横向排列布局:
Java代码:
1. package eoe. result;2. 3. @Override4. protected void onLayout(boolean changed, int left, int top, int right,5. int bottom) {6. Log.d(TAG, ">>left: " + left + " top: " + top + " right: " + right7. + " bottom:" + bottom);8. 9. /**10. * 设置布局,将子视图顺序横屏排列11. */12. for (int i = 0; i < getChildCount(); i++) {13. View child = getChildAt(i);14. child.setVisibility(View.VISIBLE);15. child.measure(right – left, bottom – top);16. child.layout(0 + i * getWidth(), 0, getWidth() + i * getWidth(),17. getHeight());
复制代码
通过覆盖
computeScroll方法,计算移动屏幕的位移和重新绘制屏幕:
Java代码:
1. package eoe. result;2. 3. @Override4. public void computeScroll() {5. if (scroller.computeScrollOffset()) {6. scrollTo(scroller.getCurrX(), 0);7. postInvalidate();8. }9. }
复制代码
编写了一个名为
scrollToScreen的方法,用于根据指定屏幕号切换到该屏幕:
Java代码:
1. /**2. * 切换到指定屏3. *4. * @param whichScreen5. */6. public void scrollToScreen(int whichScreen) {7. if (getFocusedChild() != null && whichScreen != currentScreenIndex8. && getFocusedChild() == getChildAt(currentScreenIndex)) {9. getFocusedChild().clearFocus();10. }11. 12. final int delta = whichScreen * getWidth() – getScrollX();13. scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);14. invalidate();15. 16. currentScreenIndex = whichScreen;17. }
复制代码
snapToDestination方法,是处理当屏幕拖动到一个位置松手后的处理:
Java代码:
1. /**2. * 根据当前x坐标位置确定切换到第几屏3. */4. private void snapToDestination() {5. scrollToScreen((getScrollX() + (getWidth() / 2)) / getWidth());6. }
复制代码
然后说说手势事件的处理。
eric的实现,全部使用
onTouch事件处理,这样代码不够简明。因为需要记录很多组合手势的历史数据,这样就必须有一些状态位,一些坐标数值。
我用
GestureDetector的手势处理事件简化了这方面的处理,只在手势抬起(
UP)事件处理中在
ouTouchEvent方法中做了处理。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~