网上找的一个简单的界面平滑切换类,我只改动了一点点代码。
该类不能循环切换!


import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.Scroller;
public class ScrollViewGroup extends ViewGroup {
private static final String TAG = "scroller";
private Scroller scroller;
private int currentScreenIndex;
public int getCurrentScreenIndex() {
return currentScreenIndex;
}
public void setCurrentScreenIndex(int currentScreenIndex) {
this.currentScreenIndex = currentScreenIndex;
}
private GestureDetector gestureDetector;
// 设置一个标志位,防止底层的onTouch事件重复处理UP事件
private boolean fling;
public ScrollViewGroup(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initView(context);
}
public ScrollViewGroup(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public ScrollViewGroup(Context context) {
super(context);
initView(context);
}
private void initView(final Context context) {
this.scroller = new Scroller(context);
this.gestureDetector = new GestureDetector(new OnGestureListener() {
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
if ((distanceX > 0 && currentScreenIndex < getChildCount() - 1)// 防止移动过最后一页
|| (distanceX < 0 && getScrollX() > 0)) {// 防止向第一页之前移动
scrollBy((int) distanceX, 0);
}
return true;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2,
float velocityX, float velocityY) {
Log.d(TAG, "min velocity >>>"
+ ViewConfiguration.get(context).getScaledMinimumFlingVelocity()
+ " current velocity>>" + velocityX);
// 判断是否达到最小轻松速度,取绝对值的
if (Math.abs(velocityX) > ViewConfiguration.get(context).getScaledMinimumFlingVelocity()) {
if (velocityX > 0 && currentScreenIndex > 0) {//手指从左往右划
Log.d(TAG, ">>>>fling to left");
fling = true;
scrollToScreen(currentScreenIndex - 1);
} else if (velocityX < 0 && currentScreenIndex < getChildCount() - 1) {
Log.d(TAG, ">>>>fling to right");
fling = true;
scrollToScreen(currentScreenIndex + 1);
}
}
return true;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
});
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,int bottom) {
Log.d(TAG, ">>left: " + left + " top: " + top + " right: " + right
+ " bottom:" + bottom);
/**
* 设置布局,将子视图顺序横屏排列
*/
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.setVisibility(View.VISIBLE);
child.measure(right - left, bottom - top);
child.layout(0 + i * getWidth(), 0, getWidth() + i * getWidth(),
getHeight());
}
//初始化显示第几个界面
int delta = currentScreenIndex * getWidth() - getScrollX();
scroller.startScroll(getScrollX(), 0, delta, 0, 0);
invalidate();
}
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
scrollTo(scroller.getCurrX(), 0);
postInvalidate();
}
}
@Override
public boolean onTouchEvent(MotionEvent event) {
gestureDetector.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
break;
case MotionEvent.ACTION_UP:
if (!fling) {
snapToDestination();
}
fling = false;
break;
default:
break;
}
return true;
}
/**
* 切换到指定屏
*
* @param whichScreen
*/
private void scrollToScreen(int whichScreen) {
if (getFocusedChild() != null && whichScreen != currentScreenIndex
&& getFocusedChild() == getChildAt(currentScreenIndex)) {
getFocusedChild().clearFocus();
}
final int delta = whichScreen * getWidth() - getScrollX();
scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);
invalidate();
currentScreenIndex = whichScreen;
if (onScreenChangeListener != null) {
onScreenChangeListener.onScreenChange(currentScreenIndex);
}
}
/**
* 根据当前x坐标位置确定切换到第几屏
*/
private void snapToDestination() {
scrollToScreen((getScrollX() + (getWidth() / 2)) / getWidth());
}
public interface OnScreenChangeListener {
void onScreenChange(int currentIndex);
}
private OnScreenChangeListener onScreenChangeListener;
public void setOnScreenChangeListener(OnScreenChangeListener onScreenChangeListener) {
this.onScreenChangeListener = onScreenChangeListener;
}
}

三个切换小点:


import com.easymorse.scroll.ScrollViewGroup.OnScreenChangeListener;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class PageControlView extends LinearLayout {
private Context context;
private int count;
public void bindScrollViewGroup(ScrollViewGroup scrollViewGroup) {
this.count=scrollViewGroup.getChildCount();
generatePageControl(scrollViewGroup.getCurrentScreenIndex());
scrollViewGroup.setOnScreenChangeListener(new OnScreenChangeListener() {
@Override
public void onScreenChange(int currentIndex) {
// TODO Auto-generated method stub
generatePageControl(currentIndex);
}
});
}
public PageControlView(Context context) {
super(context);
this.init(context);
}
public PageControlView(Context context, AttributeSet attrs) {
super(context, attrs);
this.init(context);
}
private void init(Context context) {
this.context=context;
}
private void generatePageControl(int currentIndex) {
this.removeAllViews();
for (int i = 0; i < this.count; i++) {
ImageView imageView = new ImageView(context);
if (currentIndex == i) {
imageView.setImageResource(R.drawable.page_indicator_focused);
} else {
imageView.setImageResource(R.drawable.page_indicator);
}
this.addView(imageView);
}
}
}

用法:


import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
public class ScrollDemosActivity extends Activity {
@SuppressWarnings("unused")
private static final String TAG = "scroller";
private ScrollViewGroup viewGroup;
private PageControlView pageControl;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
viewGroup = (ScrollViewGroup) findViewById(R.id.scrollViewGroup);
ImageView imageView = new ImageView(this);
imageView.setImageDrawable(getResources().getDrawable(R.drawable.a1));
viewGroup.addView(imageView);
viewGroup.addView(View.inflate(this, R.layout.layout_0, null));
imageView = new ImageView(this);
imageView.setImageDrawable(getResources().getDrawable(R.drawable.a2));
viewGroup.addView(imageView);
viewGroup.setCurrentScreenIndex(2);
pageControl=(PageControlView) findViewById(R.id.pageControl);
pageControl.bindScrollViewGroup(viewGroup);
}
}

布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
>
<EditText
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
/>
<RelativeLayout
android:id="@+id/myView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1"
>
<com.easymorse.scroll.ScrollViewGroup
android:id="@+id/scrollViewGroup"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
/>
<com.easymorse.scroll.PageControlView
android:id="@+id/pageControl"
android:layout_width="fill_parent"
android:layout_height="40px"
android:background="#8f00000f"
android:layout_alignParentBottom="true"
android:gravity="center"
/>
</RelativeLayout>
</LinearLayout>
<EditText android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
  • 大小: 39.8 KB
  • ScrollDemos-0.7.rar (8.1 MB)
  • 下载次数: 744
  • 查看图片附件

一个简单的界面拖动切换效果类ScrollViewGroup相关推荐

  1. android fragment界面滑动切换效果,Android App中使用ViewPager+Fragment实现滑动切换效果...

    在android应用中,多屏滑动是一种很常见的风格,没有采用viewpager的代码实现会很长,如果采用ViewPager,代码就会短很多,但是使用ViewPager也有弊端:需要导入android- ...

  2. python实现界面自由切换_PyQt实现界面翻转切换效果

    这篇文章主要为大家详细介绍了PyQt实现界面翻转切换效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 PyQt实现界面翻转切换效果是用qt的场景功能来实现的,用到了QGraphicsView,Q ...

  3. DuiVision开发教程(2)-如何写一个简单的界面程序

    基于DuiVision界面库开发的界面程序主要包括如下几部分内容: 1.资源定义,包括图片资源.各个窗口界面的xml定义文件 2.事件处理类代码,用于处理界面响应消息 3.其他业务逻辑代码 下面举例说 ...

  4. 一个简单交互界面的实现

    一个简单交互界面的实现 这个界面本来是今年做NXP智能车的时候为了更改参数方便设计的,这其实又是一套用状态机的思想来实现的一个显示框架. 这个显示界面只是一个操作逻辑,所以它的的移植性还是挺高的,虽然 ...

  5. 基于JavaScript+css写一个简单的h5动态下雨效果

    基于JavaScript+css写一个简单的h5动态下雨效果 文章目录 什么是前端 展示效果 JavaScript是什么? 步骤 1.html 2.css 3.js 什么是前端 前端它是一个工作,它的 ...

  6. HTML5.0实例练习(三) --制作一个简单登陆界面

    今天分享一个简单的实例--制作一个简单登陆界面 代码如下: 代码执行结果如下: 这里面用到了<table><th><td><tr>这些表格标签,这些在这 ...

  7. Matlab中如何使用appdesigner设计工具建立一个简单的界面

    Matlab中如何使用appdesigner设计工具建立一个简单的界面(数据的输入.处理和保存) 以使用不同算法处理图像的功能为例 建立一个新的空白界面,matlab中输入appdesigner,打开 ...

  8. python自学篇十[ 面向对象 (四) :王者荣耀小游戏+模拟一个简单的银行进行业务办理的类]

    python基础系列: python自学篇一[ Anaconda3安装 ] python自学篇二[ pycharm安装及使用 ] python自学篇三[ 判断语句if的使用 ] python自学篇四[ ...

  9. JAVA程序设计(自主模式)-创建一个简单的表示矩形的Rectangle类

    创建一个简单的表示矩形的Rectangle类,满足以下条件: 1.定义两个成员变量height和width,表示矩形的长和宽,类型为整型 2.定义一个getArea方法,返回矩形的面积 3.定义一个g ...

  10. 一个简单的页面加载管理类(包含加载中,加载失败,数据为空,加载成功)

    在最近公布的比赛框架中,发现了页面加载管理类,觉得挺有用的,所以做个简单的笔记. 什么是页面加载管理类呢?(大佬可直接跳过翻看实现过程) 如果能有这个问题,那么很好,哈哈哈,你和我一样,刚开始都挺疑惑 ...

最新文章

  1. 查看Windows系统里的进程已运行的时间
  2. [转]获取Setup文件的运行路径
  3. JavaSE 6之脚本引擎让程序如虎添翼
  4. python接口自动化测试(二)-requests.get()
  5. 计算机三四级网络技术,全国计算机等级考试四级网络技术论述题真题3
  6. FindWindowEX应用实例二则
  7. 数据库基础操作:建立学生表
  8. SSM+Dubbox电商项目 - 品优购mall
  9. 文件IO(IO编程)
  10. urule客户端和服务器配置
  11. [爬虫笔记01] Ajax爬取今日头条文章
  12. 彩色rgb图像拆分为rgb三个通道,并重新合并为彩色图像
  13. 陕西师范大学,我终于来了!
  14. 基于 LSTM-Attention 的中文新闻文本分类
  15. 从代理模式再出发!Proxy.newProxyInstance的秘密
  16. 一套问卷调查系统源码,功能齐全,适合二开或学习使用
  17. MOS管的工作原理和区分
  18. H3C防火墙端口开启二层模式,网络不通的解决方法
  19. 【AI视野·今日NLP 自然语言处理论文速览 第三十一期】Fri, 15 Apr 2022
  20. ios opencv图片处理_如何在 iOS 工程中使用 OpenCV?

热门文章

  1. linux关机卡屏,Ubuntu关机卡住无法关机的解决方法
  2. 我的世界java版海岛种子_我的世界海岛种子大全(附:大型海岛村庄种子)
  3. Android高手笔记 - 卡顿优化
  4. openpyxl中遇到TypeError: ‘generator‘ object is not subscriptable的问题和解决方案
  5. matlab dwt函数应用,MATLAB中关于DCT,DFT和DWT的相关函数
  6. 小鑫の日常系列故事(五)——卡片游戏
  7. WPF学习第十一集-深入浅出话模板
  8. 如何建设网站才有利于网站优化
  9. Compose Modifier
  10. c语言编写生日祝福语大全,最经典的生日祝福语(精选50句)