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好多了
相关推荐
4. **事件处理**:监听窗口大小改变和滚动事件,以便适时调整布局和更新可视元素。 总的来说,自定义 `VirtualizingPanel` 是一种强大的技术,可以满足各种复杂界面布局的需求,同时也充分利用了 WPF 的数据虚拟化...
在网页设计中,页面布局与滚动条是两个关键的元素,它们共同决定了用户在浏览网站时的体验。页面布局有滚动条,意味着网页的内容超过了单屏显示的范围,需要通过滚动来查看全部信息。这样的设计既有可能是由于内容...
这个方法通常称为`getItemViewType()`,它返回一个整数标识符,表示对应布局的类型。然后在`getView()`方法中,我们根据返回的类型来决定如何初始化或复用视图。 例如: ```java @Override public int ...
在Android开发中,屏幕滚动与布局设计是构建用户界面(UI)的重要组成部分。它们决定了应用程序如何展示内容,以及用户如何与这些内容互动。本篇文章将深入探讨这两个关键概念,并提供实用的技术细节和最佳实践。 ...
在Android开发中,创建一个无缝连接可循环滚动的布局是一个常见的需求,比如在轮播图、商品列表等场景。...这个自定义布局可以作为学习Android视图层次结构、滚动动画以及事件处理的一个很好的实践案例。
本模板,"全屏响应式列自适应布局html5滚动效果单页模板",正是这一理念的具体体现,利用HTML5的强大功能,构建了一个既美观又实用的网页布局。 首先,模板的核心在于其响应式列自适应布局。这种布局方式能够根据...
此外,由于它是基于宏定义的,因此在编译时就能确定布局规则,这在一定程度上也提高了程序的运行效率。 总的来说,通过学习和掌握EasySize,MFC开发者可以更高效地实现界面的自动布局,提升应用的用户体验。在实际...
通过这个示例,开发者可以学习到krkr引擎中界面设计、事件处理、数据管理等多个方面的知识,从而提升自己的游戏开发技能。在实际应用中,可以根据游戏的特定需求进行调整和扩展,创造出更加丰富的交互体验。
在这个项目中,我们关注的是如何利用多种布局的ListView来构建这样一个界面。ListView作为Android UI组件之一,适用于显示大量可滚动的数据集,通过适配器(Adapter)机制,我们可以灵活地定制每个列表项的视图。 ...
在C#编程中,我们经常会遇到需要在控件中显示大量数据的情况,此时,滚动条就显得尤为重要。...通过理解这个过程,开发者可以更好地控制界面布局,特别是当需要展示大量数据时,能够提供更好的用户体验。
在这个“QQ设置布局界面实现”的项目中,我们将深入探讨如何使用Android的UI组件和自定义形状来构建类似QQ的设置界面。 首先,让我们来理解一下`shape`元素在Android中的作用。`shape`是XML drawable资源文件的一种...
总的来说,“Qt悬浮滚动条-滚动条样式”这个话题涉及到了Qt界面设计的核心技巧,包括自定义布局、样式表的应用以及信号与槽机制的使用。通过这些技术,开发者能够创造出既美观又实用的滚动条,提升用户在Qt应用中的...
使用这个文件,开发者可以直接将其集成到MFC工程中,快速创建出具有专业布局的用户界面,而不必从头编写复杂的布局代码。 总的来说,MFC的布局管理是C++开发Windows应用时的关键技术之一。通过熟练掌握布局管理,...
在实现上,这个插件可能采用了监听滚动事件、改变元素的定位或CSS transform属性等方式来达到平滑滚动的效果。同时,为了确保在不同设备和浏览器上的兼容性,它可能包含了响应式设计和跨浏览器优化的策略。开发者只...
微信界面布局weui
在iOS开发中,AutoLayout是苹果提供的一种强大的界面布局机制,它允许开发者在不同尺寸的屏幕上创建适应性强的用户界面。本教程将深入探讨如何在...不过,掌握了这个基础,你就可以灵活应对各种复杂的界面布局需求了。
"咖啡界面布局"这个项目提供了一个很好的学习起点,它可能包含了一系列与咖啡相关的应用界面元素,如菜单、订单、评价等。通过分析这个项目,我们可以深入学习Android界面设计的基本原理和实践技巧。 首先,Android...
综上所述,WPF的界面缩放机制结合了布局管理、变换、事件处理和滚动条等多个方面,为开发者提供了丰富的工具来创建响应式、用户友好的应用程序。通过熟练掌握这些技术,开发者可以构建出在各种设备上都能优雅呈现的...
这个布局需要重写滚动事件处理,以实现头部视图的滚动同步。 `WithNavPannelView`可能是用于表示头部视图的自定义视图,它可能包含需要随着AbsListView一起滚动的元素,比如导航菜单、搜索栏等。这个视图需要有相应...
在这个组件的设计中,开发者需要考虑如何合理布局滚动条,确保其易于理解和使用,同时也要兼顾视觉美观和一致性,符合人机工程学原则。 总的来说,这个“一个界面滑动的滚动条信息程序”项目涉及到了用户界面设计的...