国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android編程實現的首頁左右滑動切換功能示例

2019-10-22 18:32:09
字體:
來源:轉載
供稿:網友

本文實例講述了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程序設計有所幫助。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 靖宇县| 寻乌县| 广德县| 资源县| 南充市| 铜鼓县| 山丹县| 绥化市| 双鸭山市| 平塘县| 容城县| 镇平县| 阿拉善盟| 靖江市| 沭阳县| 高雄县| 炉霍县| 九龙城区| 旅游| 南丹县| 凌海市| 哈巴河县| 鄢陵县| 霍州市| 德令哈市| 奉新县| 屯昌县| 崇文区| 将乐县| 卓尼县| 定西市| 吉林省| 神池县| 灵璧县| 托克托县| 宁河县| 宁陵县| 丰台区| 乌审旗| 三门峡市| 松桃|