Android编程实现的首页左右滑动切换功能示例
作者:luck_apple 时间:2022-10-15 07:20:17
本文实例讲述了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,滑动,切换
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Java回调函数与观察者模式实例代码
2023-11-16 17:30:11
Java实现浪漫流星表白的示例代码
2023-04-02 14:50:35
![](https://img.aspxhome.com/file/2023/5/68715_0s.gif)
Java实现合并两个有序序列算法示例
2021-09-06 23:23:53
Flutter有无状态类与State及生命周期详细介绍
2022-12-27 15:48:53
![](https://img.aspxhome.com/file/2023/9/139629_0s.png)
c#开发word批量转pdf源码分享
2022-01-12 07:37:29
通过Java查看程序资源占用情况
2023-11-10 02:01:19
![](https://img.aspxhome.com/file/2023/5/59175_0s.png)
详解SpringMVC的url-pattern配置及原理剖析
2023-08-11 12:00:27
![](https://img.aspxhome.com/file/2023/1/110901_0s.png)
Java进阶:Struts多模块的技巧
2023-06-18 09:40:47
Java数据结构顺序表的详细讲解
2023-11-20 23:01:35
J2SE基础之命令行中编写第一个 Hello World
2023-10-05 09:43:55
![](https://img.aspxhome.com/file/2023/1/95941_0s.png)
Java异常分类及统一处理详解
2022-01-27 12:32:24
Java C++ 算法leetcode828统计子串中唯一字符乘法原理
2022-05-09 11:19:18
![](https://img.aspxhome.com/file/2023/8/61118_0s.png)
详解Spring Cloud负载均衡重要组件Ribbon中重要类的用法
2023-07-06 02:54:01
c# WPF中CheckBox样式的使用总结
2023-07-17 15:44:46
![](https://img.aspxhome.com/file/2023/1/88421_0s.gif)
Android界面刷新的方法分享
2022-06-20 15:20:52
C#中ExecuteNonQuery()返回值注意点分析
2023-04-05 03:40:14
Eureka源码阅读之环境搭建及工程结构
2023-07-26 01:02:36
![](https://img.aspxhome.com/file/2023/6/57946_0s.png)
Android实战教程第八篇之短信备份
2021-07-17 23:31:43
java 中基本算法之希尔排序的实例详解
2023-07-30 12:26:37
Java程序常见异常及处理汇总
2021-08-12 04:20:44
![](https://img.aspxhome.com/file/2023/8/66688_0s.jpg)