软件编程
位置:首页>> 软件编程>> Android编程>> Android编程实现的首页左右滑动切换功能示例

Android编程实现的首页左右滑动切换功能示例

作者:luck_apple  发布时间:2022-10-15 07:20:17 

标签:Android,滑动,切换

本文实例讲述了Android编程实现的首页左右滑动切换功能。分享给大家供大家参考,具体如下:

很多软件会选择左右滑动的主界面,实现方式也很多,这里的仅供参考,勿喷。

不多说什么了,相信大家看看代码就明白,自己也不善言辞,望大家谅解。

自定义接口,监听滑动翻页事件:


/** 滑动后翻页事件 */
public interface OnViewChangedListener {
 public void OnViewChanged(int viewId);
}

滑动翻页view(滑动翻页不是很灵敏):


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.PointF;
import android.graphics.drawable.Drawable;
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 ScrollerView extends FrameLayout {
 private Scroller scroller;
 private Drawable drawable;
 private OnViewChangedListener listener;
 public ScrollerView(Context context) {
   this(context, null, 0);
 }
 public ScrollerView(Context context, AttributeSet attrs) {
   this(context, attrs, 0);
 }
 public ScrollerView(Context context, AttributeSet attrs, int defStyle) {
   super(context, attrs, defStyle);
   scroller = new Scroller(context);
 }
 private PointF last = new PointF();
 private final int TOUCH_SLOP = ViewConfiguration.get(getContext())
     .getScaledTouchSlop();
 @Override
 public 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;
 }
 public 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:
     final OnViewChangedListener changedListener = listener;
     int dx = (getScrollX() + width / 2) / width;
     if (dx < 0) {
       dx = 0;
     }
     if (dx > getChildCount() - 1) {
       dx = getChildCount() - 1;
     }
     changedListener.OnViewChanged(dx);
     dx *= width;
     dx -= getScrollX();
     scroller.startScroll(getScrollX(), 0, dx, 0, Math.abs(dx) * 3);
     break;
   }
   invalidate();
   return true;
 }
 @Override
 protected 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;
   }
 }
 @Override
 public void setBackgroundDrawable(Drawable d) {
   super.setBackgroundDrawable(drawable);
   drawable = d;
   super.setBackgroundDrawable(null);
 }
 @Override
 protected void dispatchDraw(Canvas canvas) {
   if (null != drawable) {
     drawable.setBounds(0, 0, getChildCount() * getWidth(), getHeight());
     drawable.draw(canvas);
   }
   super.dispatchDraw(canvas);
 }
 @Override
 public void computeScroll() {
   if (scroller.computeScrollOffset()) {
     scrollTo(scroller.getCurrX(), scroller.getCurrY());
     invalidate();
   }
 }
 /** 设置滑动后翻页事件监听 */
 public void setOnViewChangedListener(OnViewChangedListener listener) {
   this.listener = listener;
 }
}

主Activity:


import android.app.Activity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
public class MainActivity extends Activity implements OnViewChangedListener {
 private ScrollerView container;
 private View view_1, view_2;
 private ImageView imgLeft, imgRight;
 @Override
 public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
   requestWindowFeature(Window.FEATURE_NO_TITLE);
   setContentView(R.layout.main);
   initView();
 }
 private void initView() {
   LayoutInflater inflater = LayoutInflater.from(this);
   container = (ScrollerView) findViewById(R.id.main_container);
   container.setOnViewChangedListener(this);
   imgLeft = (ImageView) findViewById(R.id.img_left);
   imgRight = (ImageView) findViewById(R.id.img_right);
   view_1 = inflater.inflate(R.layout.layout_view_1, null);
   view_2 = inflater.inflate(R.layout.layout_view_2, null);
   container.addView(view_1);
   container.addView(view_2);
 }
 @Override
 public void OnViewChanged(int viewId) {
   switch (viewId) {
   case 0:
     imgLeft.setImageResource(R.drawable.main_icon_check);
     imgRight.setImageResource(R.drawable.main_icon_normal);
     break;
   case 1:
     imgLeft.setImageResource(R.drawable.main_icon_normal);
     imgRight.setImageResource(R.drawable.main_icon_check);
     break;
   }
 }
}

附:完整实例代码点击此处本站下载

希望本文所述对大家Android程序设计有所帮助。

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com