android 横向滚动屏幕实现(1)
16lz
2022-03-09
在android中横向滚动可能经常会用到用户体验也不错,最近整理了一下相关资料如下:
方案一:通过继承FrameLayout,或linearlayout布局重写onInterceptTouchEvent(MotionEvent event),onTouchEvent(MotionEvent event)方法实现
效果图:
主要代码:
package com.scroll.frame;import android.content.Context;import android.graphics.PointF;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.ViewConfiguration;import android.widget.FrameLayout;import android.widget.Scroller;public class MyScrollView extends FrameLayout {private Scroller scroller;private PointF last = new PointF();private final int TOUCH_SLOP = ViewConfiguration.get(getContext()).getScaledTouchSlop(); public MyScrollView(Context context) {super(context);scroller = new Scroller(context);}public MyScrollView(Context context, AttributeSet attrs) {super(context, attrs);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent event) {final int x = (int) event.getX();boolean flag = false;switch (event.getAction()) {case MotionEvent.ACTION_DOWN:last.x = x;break;case MotionEvent.ACTION_MOVE:final int deltaX = (int) (last.x - x);if (Math.abs(deltaX) > TOUCH_SLOP) {flag = true;}break;case MotionEvent.ACTION_UP:break;}return flag;}@Overridepublic boolean onTouchEvent(MotionEvent event) {final int x = (int) event.getX();final int width = getWidth();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (!scroller.isFinished()) {scroller.abortAnimation();}break;case MotionEvent.ACTION_MOVE:final int deltaX = (int) (last.x - x);if (Math.abs(deltaX) < TOUCH_SLOP) {break;}last.x = x;if (deltaX < 0) {if (getScrollX() > 0) {scrollBy(Math.max(-getScrollX(), deltaX), 0);}} else if (deltaX > 0) {final int availableToScroll = getChildAt(getChildCount() - 1).getRight() - getScrollX() - getWidth();if (availableToScroll > 0) {scrollBy(Math.min(availableToScroll, deltaX), 0);}}break;case MotionEvent.ACTION_UP:case MotionEvent.ACTION_CANCEL:int dx = (getScrollX() + width / 2) / width;if (dx < 0) {dx = 0;}if (dx > getChildCount() - 1) {dx = getChildCount() - 1;}dx *= width;dx -= getScrollX();scroller.startScroll(getScrollX(), 0, dx, 0, Math.abs(dx) * 3);break;}invalidate();return true;}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {final int width = getWidth();final int count = getChildCount();int height = getHeight();int childLeft = 0;for (int i = 0; i < count; i++) {final View child = getChildAt(i);child.layout(childLeft, 0, childLeft + width, height);childLeft += width;}}@Overridepublic void computeScroll() {if (scroller.computeScrollOffset()) {scrollTo(scroller.getCurrX(), scroller.getCurrY());invalidate();}} }
package com.scroll.frame;import android.app.Activity;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.widget.FrameLayout;public class FlowScreenActivity extends Activity {private MyScrollView container;private View v1,v2,v3; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setContentView(R.layout.main); getView(); } void getView(){ LayoutInflater inflater = LayoutInflater.from(this); container = new MyScrollView(this); // container.setVerticalScrollBarEnabled(false); // container.setHorizontalScrollBarEnabled(false); setContentView(container); v1 = inflater.inflate(R.layout.main, null); v2 = inflater.inflate(R.layout.second, null); v3 = inflater.inflate(R.layout.third, null); FrameLayout.LayoutParams lp = new FrameLayout.LayoutParams(-1, -1); container.addView(v1, new FrameLayout.LayoutParams(lp)); container.addView(v2, new FrameLayout.LayoutParams(lp)); container.addView(v3, new FrameLayout.LayoutParams(lp)); } }
布局就不给代码了随便弄几个布局就可以了。
更多相关文章
- android Timer的用法实例
- 【Android休眠】之Android对PowerKey事件的处理(1)代码流程
- Android(安卓)代码执行Linux Shell小记
- android声音调整源代码分析
- Android(安卓)Http请求方法汇总
- Android(安卓)API——自定义组件(Custom Components)
- Android第一行代码(第二版)
- Android(安卓)用代码获取基站号(cell)和小区号(lac)
- 在屏幕上方是actionBar tab的ViewPager页面里面嵌套子tab并显示