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好多了
相关推荐
在Android中,当一个布局的大小超过了屏幕的显示范围时,就需要使用滚动来展示全部内容。这通常涉及到ScrollView和HorizontalScrollView组件。ScrollView允许用户垂直滚动内容,而HorizontalScrollView则支持水平...
4. **事件处理**:监听窗口大小改变和滚动事件,以便适时调整布局和更新可视元素。 总的来说,自定义 `VirtualizingPanel` 是一种强大的技术,可以满足各种复杂界面布局的需求,同时也充分利用了 WPF 的数据虚拟化...
在网页设计中,页面布局与滚动条是两个关键的元素,它们共同决定了用户在浏览网站时的体验。页面布局有滚动条,意味着网页的内容超过了单屏显示的范围,需要通过滚动来查看全部信息。这样的设计既有可能是由于内容...
这个方法通常称为`getItemViewType()`,它返回一个整数标识符,表示对应布局的类型。然后在`getView()`方法中,我们根据返回的类型来决定如何初始化或复用视图。 例如: ```java @Override public int ...
在Android开发中,屏幕滚动与布局设计是构建用户界面(UI)的重要组成部分。它们决定了应用程序如何展示内容,以及用户如何与这些内容互动。本篇文章将深入探讨这两个关键概念,并提供实用的技术细节和最佳实践。 ...
描述中提到的工具可能是像DroidDraw这样的应用程序,它是一个早期的图形化用户界面(GUI)工具,可以帮助开发者无需编写XML代码就能设计Android布局。DroidDrawr1b21.jar可能就是这个工具的一个版本,允许用户通过...
在Android开发中,创建一个无缝连接可循环滚动的布局是一个常见的需求,比如在轮播图、商品列表等场景。...这个自定义布局可以作为学习Android视图层次结构、滚动动画以及事件处理的一个很好的实践案例。
本模板,"全屏响应式列自适应布局html5滚动效果单页模板",正是这一理念的具体体现,利用HTML5的强大功能,构建了一个既美观又实用的网页布局。 首先,模板的核心在于其响应式列自适应布局。这种布局方式能够根据...
在IT行业中,设计一个聊天界面的布局是一项关键任务,尤其对于即时通讯应用而言。QQ作为中国最流行的聊天软件之一,其用户界面设计有着广泛的影响力。本教程将介绍如何模仿QQ聊天界面的部分布局,并提供相关代码供...
通过这个示例,开发者可以学习到krkr引擎中界面设计、事件处理、数据管理等多个方面的知识,从而提升自己的游戏开发技能。在实际应用中,可以根据游戏的特定需求进行调整和扩展,创造出更加丰富的交互体验。
在这个“QQ设置布局界面实现”的项目中,我们将深入探讨如何使用Android的UI组件和自定义形状来构建类似QQ的设置界面。 首先,让我们来理解一下`shape`元素在Android中的作用。`shape`是XML drawable资源文件的一种...
在实现上,这个插件可能采用了监听滚动事件、改变元素的定位或CSS transform属性等方式来达到平滑滚动的效果。同时,为了确保在不同设备和浏览器上的兼容性,它可能包含了响应式设计和跨浏览器优化的策略。开发者只...
微信界面布局weui
总之,Android界面布局的代码实现涉及`View`、`ViewGroup`、事件监听和布局参数等多个方面。通过理解和实践,开发者可以更加灵活地设计和控制应用程序的用户界面。对于初学者而言,这是一个很好的学习起点,对于经验...
在iOS开发中,AutoLayout是苹果提供的一种强大的界面布局机制,它允许开发者在不同尺寸的屏幕上创建适应性强的用户界面。本教程将深入探讨如何在...不过,掌握了这个基础,你就可以灵活应对各种复杂的界面布局需求了。
"咖啡界面布局"这个项目提供了一个很好的学习起点,它可能包含了一系列与咖啡相关的应用界面元素,如菜单、订单、评价等。通过分析这个项目,我们可以深入学习Android界面设计的基本原理和实践技巧。 首先,Android...
综上所述,WPF的界面缩放机制结合了布局管理、变换、事件处理和滚动条等多个方面,为开发者提供了丰富的工具来创建响应式、用户友好的应用程序。通过熟练掌握这些技术,开发者可以构建出在各种设备上都能优雅呈现的...
在这个组件的设计中,开发者需要考虑如何合理布局滚动条,确保其易于理解和使用,同时也要兼顾视觉美观和一致性,符合人机工程学原则。 总的来说,这个“一个界面滑动的滚动条信息程序”项目涉及到了用户界面设计的...
在Java Swing或Android开发中,布局管理器是创建用户界面不可或缺的部分,它们负责安排和定位组件,使得界面在不同屏幕尺寸和分辨率下都能保持良好的视觉效果。事件处理代码则涉及用户与应用程序之间的交互,确保当...
这个库的实现可能涉及到Android的触摸事件处理、视图动画以及布局管理。开发者可能需要自定义滚动监听器,根据滚动距离和方向触发相应的视图状态变化。视图的隐藏和显示可以通过设置其透明度、移动位置或是使用...