Android編程實(shí)現(xiàn)的首頁左右滑動(dòng)切換功能示例
本文實(shí)例講述了Android編程實(shí)現(xiàn)的首頁左右滑動(dòng)切換功能。分享給大家供大家參考,具體如下:
很多軟件會(huì)選擇左右滑動(dòng)的主界面,實(shí)現(xiàn)方式也很多,這里的僅供參考,勿噴。
不多說什么了,相信大家看看代碼就明白,自己也不善言辭,望大家諒解。
自定義接口,監(jiān)聽滑動(dòng)翻頁事件:
/** 滑動(dòng)后翻頁事件 */
public interface OnViewChangedListener {
public void OnViewChanged(int viewId);
}
滑動(dòng)翻頁view(滑動(dòng)翻頁不是很靈敏):
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();
}
}
/** 設(shè)置滑動(dòng)后翻頁事件監(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;
}
}
}
附:完整實(shí)例代碼點(diǎn)擊此處本站下載。
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android布局layout技巧總結(jié)》、《Android視圖View技巧總結(jié)》、《Android開發(fā)入門與進(jìn)階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android多媒體操作技巧匯總(音頻,視頻,錄音等)》、《Android基本組件用法總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android App中使用ViewPager+Fragment實(shí)現(xiàn)滑動(dòng)切換效果
- Android開發(fā)之使用ViewPager實(shí)現(xiàn)圖片左右滑動(dòng)切換效果
- Android編程實(shí)現(xiàn)ViewPager多頁面滑動(dòng)切換及動(dòng)畫效果的方法
- Android實(shí)現(xiàn)界面左右滑動(dòng)切換功能
- Android啟動(dòng)屏實(shí)現(xiàn)左右滑動(dòng)切換查看功能
- Android實(shí)現(xiàn)微信首頁左右滑動(dòng)切換效果
- Android應(yīng)用中利用ViewPager實(shí)現(xiàn)多頁面滑動(dòng)切換效果示例
- Android Listview上下拉動(dòng)刷新tab滑動(dòng)切換功能
- Android編程實(shí)現(xiàn)左右滑動(dòng)切換背景的方法
- Android中的ViewPager視圖滑動(dòng)切換類的入門實(shí)例教程
- Android使用TabLayou+fragment+viewpager實(shí)現(xiàn)滑動(dòng)切換頁面效果
- Android ViewPager撤消左右滑動(dòng)切換功能實(shí)現(xiàn)代碼
相關(guān)文章
Android仿淘寶首頁頭條View垂直滾動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Android仿淘寶首頁頭條View垂直滾動(dòng)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-05-05
android系統(tǒng)拍照結(jié)合android-crop裁剪圖片
這篇文章主要為大家詳細(xì)介紹android系統(tǒng)拍照結(jié)合android-crop裁剪圖片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
Android Socket 線程連接openwrt與arduino單片機(jī)串口雙向通信的實(shí)例解析
這篇文章主要介紹了Android Socket 線程連接openwrt與arduino單片機(jī)串口雙向通信的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-11-11
ViewPager+Fragment實(shí)現(xiàn)側(cè)滑導(dǎo)航欄
這篇文章主要為大家詳細(xì)介紹了ViewPager+Fragment實(shí)現(xiàn)側(cè)滑導(dǎo)航欄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
Android Jetpack Compose實(shí)現(xiàn)列表吸頂效果
安卓傳統(tǒng)的Recyclerview打造懸浮頭部StickyHeader的吸頂效果,十分麻煩,而在Compose中就簡(jiǎn)單多了。因此,本文將采用Jetpack Compose實(shí)現(xiàn)列表吸頂效果,需要的可以參考一下2022-02-02
基于Android studio3.6的JNI教程之ncnn之語義分割ENet
這篇文章主要介紹了基于Android studio3.6的JNI教程之ncnn之語義分割ENet的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2020-03-03
android圖片類型之間相互轉(zhuǎn)換實(shí)現(xiàn)代碼
這篇文章主要介紹了android圖片類型之間相互轉(zhuǎn)換的方法,涉及Android實(shí)現(xiàn)各種常用圖片類型及字節(jié)類型的轉(zhuǎn)換技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10

