package com.example.scrolldemo; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Rect; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.view.animation.TranslateAnimation; import android.widget.ScrollView; /** * 可以拖动的ScrollView * */ public class CustomerScrollView extends ScrollView { private static final int size = 4; private View inner; private float y; private Rect normal = new Rect();; public CustomerScrollView(Context context) { super(context); } public CustomerScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onFinishInflate() { if (getChildCount() > 0) { inner = getChildAt(0); } } @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouchEvent(MotionEvent ev) { if (inner == null) { return super.onTouchEvent(ev); } else { commOnTouchEvent(ev); } return super.onTouchEvent(ev); } public void commOnTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: y = ev.getY(); break; case MotionEvent.ACTION_UP: if (isNeedAnimation()) { // Log.v("mlguitar", "will up and animation"); animation(); } break; case MotionEvent.ACTION_MOVE: final float preY = y; float nowY = ev.getY(); /** * size=4 表示 拖动的距离为屏幕的高度的1/4 */ int deltaY = (int) (preY - nowY) / size; // 滚动 // scrollBy(0, deltaY); y = nowY; if (isNeedMove()) { if (normal.isEmpty()) { normal.set(inner.getLeft(), inner.getTop(), inner.getRight(), inner.getBottom()); return; } int yy = inner.getTop() - deltaY; // 移动布局 inner.layout(inner.getLeft(), yy, inner.getRight(), inner.getBottom() - deltaY); } break; default: break; } } public void animation() { TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(), normal.top); ta.setDuration(200); inner.startAnimation(ta); inner.layout(normal.left, normal.top, normal.right, normal.bottom); normal.setEmpty(); } public boolean isNeedAnimation() { return !normal.isEmpty(); } public boolean isNeedMove() { int offset = inner.getMeasuredHeight() - getHeight(); int scrollY = getScrollY(); if (scrollY == 0 || scrollY == offset) { return true; } return false; } }
<?xml version="1.0" encoding="utf-8"?> <com.example.scrolldemo.CustomerScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="vertical" android:scrollbars="none" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/tv_version_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="地方萨芬萨芬萨芬石佛"/> </LinearLayout> </com.example.scrolldemo.CustomerScrollView>
比直接用Scrollview好多了
相关推荐
有时我们需要在ScrollView完全显示出来之后才开始监听滚动,这时这个接口就派上了用场。在onGlobalLayout()方法中,你可以检查ScrollView的可见性,并根据需要启动滚动监听。 4. **滚动事件的应用场景**:滚动事件...
在Android中,当一个布局的大小超过了屏幕的显示范围时,就需要使用滚动来展示全部内容。这通常涉及到ScrollView和HorizontalScrollView组件。ScrollView允许用户垂直滚动内容,而HorizontalScrollView则支持水平...
4. **事件处理**:监听窗口大小改变和滚动事件,以便适时调整布局和更新可视元素。 总的来说,自定义 `VirtualizingPanel` 是一种强大的技术,可以满足各种复杂界面布局的需求,同时也充分利用了 WPF 的数据虚拟化...
这个方法通常称为`getItemViewType()`,它返回一个整数标识符,表示对应布局的类型。然后在`getView()`方法中,我们根据返回的类型来决定如何初始化或复用视图。 例如: ```java @Override public int ...
在本项目中,“Android应用源码仿唱吧部分布局界面项目”是一个针对初学者和进阶开发者提供的实战案例,旨在帮助他们理解并掌握Android应用程序开发中的界面设计与布局构建技术。这个项目仿照了知名的音乐类应用...
在Android开发中,屏幕滚动与布局设计是构建用户界面(UI)的重要组成部分。它们决定了应用程序如何展示内容,以及用户如何与这些内容互动。本篇文章将深入探讨这两个关键概念,并提供实用的技术细节和最佳实践。 ...
"ios-特斯拉组件、QQ联系人布局、多页面嵌套滚动、悬停效果、美团、淘宝等嵌套滚动页面.zip"这个压缩包文件提供了一些解决方案,它涉及到iOS应用中的多个关键知识点。 首先,"特斯拉组件"可能指的是借鉴了特斯拉...
在Android开发中,创建一个无缝连接可循环滚动的布局是一个常见的需求,比如在轮播图、商品列表等场景。...这个自定义布局可以作为学习Android视图层次结构、滚动动画以及事件处理的一个很好的实践案例。
本模板,"全屏响应式列自适应布局html5滚动效果单页模板",正是这一理念的具体体现,利用HTML5的强大功能,构建了一个既美观又实用的网页布局。 首先,模板的核心在于其响应式列自适应布局。这种布局方式能够根据...
此外,由于它是基于宏定义的,因此在编译时就能确定布局规则,这在一定程度上也提高了程序的运行效率。 总的来说,通过学习和掌握EasySize,MFC开发者可以更高效地实现界面的自动布局,提升应用的用户体验。在实际...
通过这个示例,开发者可以学习到krkr引擎中界面设计、事件处理、数据管理等多个方面的知识,从而提升自己的游戏开发技能。在实际应用中,可以根据游戏的特定需求进行调整和扩展,创造出更加丰富的交互体验。
本资源提供的"VC++界面换肤 界面自绘 内置滚动条自绘 菜单自绘源代码"是关于如何在VC++环境中实现自定义用户界面风格的实践示例,这对于提升应用的用户体验和个性化设计至关重要。 界面换肤是指改变应用程序的外观...
在这个“QQ设置布局界面实现”的项目中,我们将深入探讨如何使用Android的UI组件和自定义形状来构建类似QQ的设置界面。 首先,让我们来理解一下`shape`元素在Android中的作用。`shape`是XML drawable资源文件的一种...
总的来说,“Qt悬浮滚动条-滚动条样式”这个话题涉及到了Qt界面设计的核心技巧,包括自定义布局、样式表的应用以及信号与槽机制的使用。通过这些技术,开发者能够创造出既美观又实用的滚动条,提升用户在Qt应用中的...
通过这个源码程序,开发者不仅可以学习到C# WinForm中的界面布局技巧,还能深入理解Ribbon控件的使用。同时,对于自定义控件、事件处理、数据绑定等方面的知识也有一定的提升。总的来说,这是一个很好的学习和实践...
在这个"界面布局实例"中,开发者可能从头到尾经历了创建布局、设置属性、处理事件、适应不同设备和优化性能的全过程,这些都是Android开发的基本功。通过实践,不仅可以加深对布局理解,也能提升开发效率。
标题中的“红色界面QQ界面的随屏滚动QQ客服代码”指的是一个特定的网页设计效果,它结合了QQ的视觉风格和一种动态的客服系统。这个效果允许一个客服对话框随着用户在网页上的滚动而始终保持在屏幕可见范围内,提高了...
在实现上,这个插件可能采用了监听滚动事件、改变元素的定位或CSS transform属性等方式来达到平滑滚动的效果。同时,为了确保在不同设备和浏览器上的兼容性,它可能包含了响应式设计和跨浏览器优化的策略。开发者只...
微信界面布局weui
"咖啡界面布局"这个项目提供了一个很好的学习起点,它可能包含了一系列与咖啡相关的应用界面元素,如菜单、订单、评价等。通过分析这个项目,我们可以深入学习Android界面设计的基本原理和实践技巧。 首先,Android...