本文实例讲述了Android编程实现的首页左右滑动切换功能。分享给大家供大家参考,具体如下:
很多软件会选择左右滑动的主界面,实现方式也很多,这里的仅供参考,勿喷。
不多说什么了,相信大家看看代码就明白,自己也不善言辞,望大家谅解。
/** 滑动后翻页事件 */ public interface OnViewChangedListener { public void OnViewChanged(int viewId); }
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,AttributeSet attrs,int defStyle) { super(context,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,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(),dx,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,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,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相关内容感兴趣的读者可查看本站专题:《Android布局layout技巧总结》、《Android视图View技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。