`
龙哥IT
  • 浏览: 254590 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

以后布局界面就加上CustomerScrollView这个滚动事件

 
阅读更多
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则支持水平...

    WPF自定义VirtualizingPanel,实现界面动态布局

    4. **事件处理**:监听窗口大小改变和滚动事件,以便适时调整布局和更新可视元素。 总的来说,自定义 `VirtualizingPanel` 是一种强大的技术,可以满足各种复杂界面布局的需求,同时也充分利用了 WPF 的数据虚拟化...

    页面布局有滚动条

    在网页设计中,页面布局与滚动条是两个关键的元素,它们共同决定了用户在浏览网站时的体验。页面布局有滚动条,意味着网页的内容超过了单屏显示的范围,需要通过滚动来查看全部信息。这样的设计既有可能是由于内容...

    解决Android ListView滚动布局错位

    这个方法通常称为`getItemViewType()`,它返回一个整数标识符,表示对应布局的类型。然后在`getView()`方法中,我们根据返回的类型来决定如何初始化或复用视图。 例如: ```java @Override public int ...

    android-屏幕滚动与布局设计

    在Android开发中,屏幕滚动与布局设计是构建用户界面(UI)的重要组成部分。它们决定了应用程序如何展示内容,以及用户如何与这些内容互动。本篇文章将深入探讨这两个关键概念,并提供实用的技术细节和最佳实践。 ...

    安卓界面布局工具(layout布局)

    描述中提到的工具可能是像DroidDraw这样的应用程序,它是一个早期的图形化用户界面(GUI)工具,可以帮助开发者无需编写XML代码就能设计Android布局。DroidDrawr1b21.jar可能就是这个工具的一个版本,允许用户通过...

    无缝连接可循环滚动布局

    在Android开发中,创建一个无缝连接可循环滚动的布局是一个常见的需求,比如在轮播图、商品列表等场景。...这个自定义布局可以作为学习Android视图层次结构、滚动动画以及事件处理的一个很好的实践案例。

    全屏响应式列自适应布局html5滚动效果单页模板

    本模板,"全屏响应式列自适应布局html5滚动效果单页模板",正是这一理念的具体体现,利用HTML5的强大功能,构建了一个既美观又实用的网页布局。 首先,模板的核心在于其响应式列自适应布局。这种布局方式能够根据...

    聊天界面的布局

    在IT行业中,设计一个聊天界面的布局是一项关键任务,尤其对于即时通讯应用而言。QQ作为中国最流行的聊天软件之一,其用户界面设计有着广泛的影响力。本教程将介绍如何模仿QQ聊天界面的部分布局,并提供相关代码供...

    krkr实现滚动存档界面示例

    通过这个示例,开发者可以学习到krkr引擎中界面设计、事件处理、数据管理等多个方面的知识,从而提升自己的游戏开发技能。在实际应用中,可以根据游戏的特定需求进行调整和扩展,创造出更加丰富的交互体验。

    QQ设置布局界面实现(android)

    在这个“QQ设置布局界面实现”的项目中,我们将深入探讨如何使用Android的UI组件和自定义形状来构建类似QQ的设置界面。 首先,让我们来理解一下`shape`元素在Android中的作用。`shape`是XML drawable资源文件的一种...

    简单实用的App样式单页全屏滚动布局jQuery插件

    在实现上,这个插件可能采用了监听滚动事件、改变元素的定位或CSS transform属性等方式来达到平滑滚动的效果。同时,为了确保在不同设备和浏览器上的兼容性,它可能包含了响应式设计和跨浏览器优化的策略。开发者只...

    微信界面布局weui

    微信界面布局weui

    使用代码编写Android界面布局源代码

    总之,Android界面布局的代码实现涉及`View`、`ViewGroup`、事件监听和布局参数等多个方面。通过理解和实践,开发者可以更加灵活地设计和控制应用程序的用户界面。对于初学者而言,这是一个很好的学习起点,对于经验...

    ios 自动布局滚动视图

    在iOS开发中,AutoLayout是苹果提供的一种强大的界面布局机制,它允许开发者在不同尺寸的屏幕上创建适应性强的用户界面。本教程将深入探讨如何在...不过,掌握了这个基础,你就可以灵活应对各种复杂的界面布局需求了。

    咖啡界面布局

    "咖啡界面布局"这个项目提供了一个很好的学习起点,它可能包含了一系列与咖啡相关的应用界面元素,如菜单、订单、评价等。通过分析这个项目,我们可以深入学习Android界面设计的基本原理和实践技巧。 首先,Android...

    wpf 界面控件随着界面大小进行缩放

    综上所述,WPF的界面缩放机制结合了布局管理、变换、事件处理和滚动条等多个方面,为开发者提供了丰富的工具来创建响应式、用户友好的应用程序。通过熟练掌握这些技术,开发者可以构建出在各种设备上都能优雅呈现的...

    一个界面滑动的滚动条信息程序

    在这个组件的设计中,开发者需要考虑如何合理布局滚动条,确保其易于理解和使用,同时也要兼顾视觉美观和一致性,符合人机工程学原则。 总的来说,这个“一个界面滑动的滚动条信息程序”项目涉及到了用户界面设计的...

    布局管理器及事件处理代码

    在Java Swing或Android开发中,布局管理器是创建用户界面不可或缺的部分,它们负责安排和定位组件,使得界面在不同屏幕尺寸和分辨率下都能保持良好的视觉效果。事件处理代码则涉及用户与应用程序之间的交互,确保当...

    Android-在滚动自定义NestedScrollView的同时使视图从顶部和底部隐藏的库

    这个库的实现可能涉及到Android的触摸事件处理、视图动画以及布局管理。开发者可能需要自定义滚动监听器,根据滚动距离和方向触发相应的视图状态变化。视图的隐藏和显示可以通过设置其透明度、移动位置或是使用...

Global site tag (gtag.js) - Google Analytics