Android編程實現(xiàn)的首頁左右滑動切換功能示例
本文實例講述了Android編程實現(xiàn)的首頁左右滑動切換功能。分享給大家供大家參考,具體如下:
很多軟件會選擇左右滑動的主界面,實現(xiàn)方式也很多,這里的僅供參考,勿噴。
不多說什么了,相信大家看看代碼就明白,自己也不善言辭,望大家諒解。
自定義接口,監(jiān)聽滑動翻頁事件:
/** 滑動后翻頁事件 */ 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(); } } /** 設置滑動后翻頁事件監(jiān)聽 */ 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相關內(nèi)容感興趣的讀者可查看本站專題:《Android布局layout技巧總結(jié)》、《Android視圖View技巧總結(jié)》、《Android開發(fā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設計有所幫助。
- Android App中使用ViewPager+Fragment實現(xiàn)滑動切換效果
- Android開發(fā)之使用ViewPager實現(xiàn)圖片左右滑動切換效果
- Android編程實現(xiàn)ViewPager多頁面滑動切換及動畫效果的方法
- Android實現(xiàn)界面左右滑動切換功能
- Android啟動屏實現(xiàn)左右滑動切換查看功能
- Android實現(xiàn)微信首頁左右滑動切換效果
- Android應用中利用ViewPager實現(xiàn)多頁面滑動切換效果示例
- Android Listview上下拉動刷新tab滑動切換功能
- Android編程實現(xiàn)左右滑動切換背景的方法
- Android中的ViewPager視圖滑動切換類的入門實例教程
- Android使用TabLayou+fragment+viewpager實現(xiàn)滑動切換頁面效果
- Android ViewPager撤消左右滑動切換功能實現(xiàn)代碼
相關文章
基于Android開發(fā)支持表情的實現(xiàn)詳解
本篇文章是對在Android開發(fā)中支持表情的實現(xiàn)代碼進行了介紹。需要的朋友參考下2013-05-05Android控件ImageSwitcher實現(xiàn)左右圖片切換功能
這篇文章主要為大家詳細介紹了Android控件ImageSwitcher實現(xiàn)左右圖片切換功能,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-05-05Android開發(fā)graphics?bufferqueue整體流程
這篇文章主要為大家介紹了Android開發(fā)graphics?bufferqueue整體流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07實例講解Android App使用自帶的SQLite數(shù)據(jù)庫的基本方法
這篇文章主要介紹了Android App使用自帶的SQLite數(shù)據(jù)庫的基本方法,SQLite是一個小巧的內(nèi)嵌型數(shù)據(jù)庫,在數(shù)據(jù)庫需求不大的情況下使用SQLite其實非常有效,需要的朋友可以參考下2016-04-04