`
梦想家dream
  • 浏览: 63771 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

Android自定义控件--1(TextView跑马灯效果)

阅读更多
  N久没有跟新了,最近做的银行项目中的一个自定义控件(用于状态栏欢迎语句+柜员信息的滚动,简单点说就是TextView跑马灯效果)
package com.hacheng.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.VelocityTracker;
import android.view.ViewConfiguration;
import android.view.animation.DecelerateInterpolator;
import android.widget.Scroller;
import android.widget.TextView;

public class ScrollTextView extends TextView {
	private Scroller mScroller;
	private int mTouchSlop;
	private int mMinimumVelocity;
	private int mMaximumVelocity;

	private float mLastMotionY;
	private boolean mIsBeingDragged;
	private VelocityTracker mVelocityTracker;
	private int mActivePointerId = INVALID_POINTER;

	private static final int INVALID_POINTER = -1;

	public ScrollTextView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initView();
	}

	public ScrollTextView(Context context, AttributeSet attrs) {
		super(context, attrs);
		initView();
	}

	public ScrollTextView(Context context) {
		super(context);
		initView();
	}

	private void initView() {
		final Context cx = getContext();
		// 设置滚动减速器,在fling中会用到
		mScroller = new Scroller(cx, new DecelerateInterpolator(0.5f));
		final ViewConfiguration configuration = ViewConfiguration.get(cx);
		mTouchSlop = configuration.getScaledTouchSlop();
		mMinimumVelocity = configuration.getScaledMinimumFlingVelocity();
		mMaximumVelocity = configuration.getScaledMaximumFlingVelocity();

	}

	/**
	 * 此方法为最后机会来修改mScrollX,mScrollY. 这方法后将根据mScrollX,mScrollY来偏移Canvas已实现内容滚动
	 */
	@Override
	public void computeScroll() {
		super.computeScroll();

		final Scroller scroller = mScroller;
		if (scroller.computeScrollOffset()) { // 正在滚动,让view滚动到当前位置
			int scrollY = scroller.getCurrY();
			final int maxY = (getLineCount() * getLineHeight()
					+ getPaddingTop() + getPaddingBottom())
					- getHeight();
			boolean toEdge = scrollY < 0 || scrollY > maxY;
			if (scrollY < 0)
				scrollY = 0;
			else if (scrollY > maxY)
				scrollY = maxY;

			/*
			 * 下面等同于: mScrollY = scrollY; awakenScrollBars(); //显示滚动条,必须在xml中配置。
			 * postInvalidate();
			 */
			scrollTo(0, scrollY);
			if (toEdge) // 移到两端,由于位置没有发生变化,导致滚动条不显示
				awakenScrollBars();
		}
	}

	public void fling(int velocityY) {
		final int maxY = (getLineCount() * getLineHeight() + getPaddingTop() + getPaddingBottom())
				- getHeight();

		mScroller.fling(getScrollX(), getScrollY(), 0, velocityY, 0, 0, 0,
				Math.max(0, maxY));

		// 刷新,让父控件调用computeScroll()
		invalidate();
	}

	@Override
	public boolean onTouchEvent(MotionEvent ev) {
		/*
		 * 事件处理方式:先自己处理后交给父类处理。 PS:方式不同,可能导致效果不同。请根据需求自行修改。
		 */
		boolean handled = false;
		final int contentHeight = getLineCount() * getLineHeight();
		if (contentHeight > getHeight()) {
			handled = processScroll(ev);
		}

		return handled | super.onTouchEvent(ev);
	}

	private boolean processScroll(MotionEvent ev) {
		boolean handled = false;
		if (mVelocityTracker == null) {
			mVelocityTracker = VelocityTracker.obtain();
		}
		mVelocityTracker.addMovement(ev); // 帮助类,用来在fling时计算移动初速度

		final int action = ev.getAction();

		switch (action) {
		case MotionEvent.ACTION_DOWN: {
			if (!mScroller.isFinished()) {
				mScroller.forceFinished(true);
			}

			mLastMotionY = ev.getY();
			mActivePointerId = ev.getPointerId(0);
			mIsBeingDragged = true;
			handled = true;
			break;
		}
		case MotionEvent.ACTION_MOVE: {
			final int pointerId = mActivePointerId;
			if (mIsBeingDragged && INVALID_POINTER != pointerId) {
				final int pointerIndex = ev.findPointerIndex(pointerId);
				final float y = ev.getY(pointerIndex);
				int deltaY = (int) (mLastMotionY - y);

				if (Math.abs(deltaY) > mTouchSlop) { // 移动距离(正负代表方向)必须大于ViewConfiguration设置的默认值
					mLastMotionY = y;

					/*
					 * 默认滚动时间为250ms,建议立即滚动,否则滚动效果不明显 或者直接使用scrollBy(0, deltaY);
					 */
					mScroller.startScroll(getScrollX(), getScrollY(), 0,
							deltaY, 0);
					invalidate();
					handled = true;
				}
			}
			break;
		}
		case MotionEvent.ACTION_UP: {
			final int pointerId = mActivePointerId;
			if (mIsBeingDragged && INVALID_POINTER != pointerId) {
				final VelocityTracker velocityTracker = mVelocityTracker;
				velocityTracker.computeCurrentVelocity(1000, mMaximumVelocity);
				int initialVelocity = (int) velocityTracker
						.getYVelocity(pointerId);

				if (Math.abs(initialVelocity) > mMinimumVelocity) {
					fling(-initialVelocity);
				}

				mActivePointerId = INVALID_POINTER;
				mIsBeingDragged = false;

				if (mVelocityTracker != null) {
					mVelocityTracker.recycle();
					mVelocityTracker = null;
				}

				handled = true;
			}
			break;
		}
		}
		return handled;
	}
}


layout中引用:
 <com.hacheng.view.ScrollTextView
            android:id="@+id/scrollview"
            android:layout_width="750px"
            android:layout_height="48px"
            android:ellipsize="marquee"
            android:focusable="true"
            android:focusableInTouchMode="true"
            android:lines="1"
            android:marqueeRepeatLimit="marquee_forever"
            android:scrollHorizontally="true"
            android:singleLine="true"
            android:text="欢迎光临中国某某银行!柜员号:25645 地区号:658978"
            android:textSize="38dp" >
        </com.hacheng.view.ScrollTextView>


源码下载请戳这里:
分享到:
评论

相关推荐

    android TextView 跑马灯效果

    总的来说,Android的TextView跑马灯效果是通过结合XML布局属性和代码控制实现的,它为展示长文本提供了灵活的解决方案,特别是在有限的空间内。理解和掌握这个功能对于Android开发者来说非常有用,可以提升用户体验...

    android自定义横向跑马灯TextView(两种,即使一个字符也能跑马灯)

    "android自定义横向跑马灯TextView"就是一个典型的示例,它允许文字在一个视图内不断滚动,模拟LED显示屏上的跑马灯效果。这种效果通常用于显示通知、提示信息或者标题,即使只有一个字符也能实现滚动。 跑马灯效果...

    Android高级应用源码-跑马灯效果MarqueTextView textview 循环 跑马灯效果.zip

    本资源"Android高级应用源码-跑马灯效果MarqueTextView textview 循环 跑马灯效果.zip"提供了一个实现这一效果的示例,主要涉及到自定义控件MarqueTextView的使用。下面将详细介绍跑马灯效果的原理以及如何通过...

    Android自定义TextView跑马灯效果

    "Android自定义TextView跑马灯效果" Android 自定义TextView跑马灯效果是指在 Android 平台上通过自定义TextView实现跑马灯滚动效果。下面是关于Android自定义TextView跑马灯效果的知识点: 1. TextView 的跑马灯...

    Android ListView,TextView跑马灯Demo

    综上所述,这个"Android ListView,TextView跑马灯Demo"展示了如何在ListView的每一项中实现TextView的跑马灯效果。通过正确设置TextView的属性和ListView的焦点管理,我们可以在应用中创建出动态、吸引人的UI元素,...

    老罗视频代码textview跑马灯效果

    综上所述,"老罗视频代码textview跑马灯效果"主要涉及的是Android中TextView的跑马灯效果实现,包括XML属性配置、代码逻辑设置以及可能遇到的问题和解决策略。通过理解这些知识点,开发者可以灵活地在自己的应用中...

    android TextView跑马灯

    以上就是关于Android中TextView跑马灯效果的基本介绍和实现方法。通过合理设置属性和编写适当的代码,我们可以创建出满足需求的跑马灯效果。同时,自定义的MarqueeTextView可能会提供更丰富的定制选项,以适应各种...

    Android自定义TextView实现跑马灯效果

    在Android开发中,自定义控件是提升应用特色和用户体验的...以上就是实现Android自定义TextView跑马灯效果的详细过程。通过这个例子,开发者可以进一步理解Android自定义控件的机制,并将其应用于更多复杂的效果实现。

    Android垂直滚动TextView跑马灯Demo

    跑马灯效果在Android中通常是通过自定义View或者对现有控件进行扩展来实现的,而在这个Demo中,我们将重点讨论如何在TextView中实现垂直滚动的效果。 首先,TextView是Android中最基础的文本显示控件,它通常用于...

    自定义TextView实现竖直跑马灯效果,特殊字符串改变颜色

    在Android开发中,自定义控件是提升应用用户体验和实现个性化功能的重要手段。本文将深入讲解如何通过自定义TextView来...通过不断学习和实践,开发者可以更好地掌握Android自定义控件的精髓,提高开发效率和应用质量。

    Android中继承TextView实现文字的跑马灯效果

    下面将详细解释如何通过继承TextView来创建具有跑马灯效果的自定义控件。 首先,我们需要了解TextView的基本概念。TextView是Android UI布局中的一个基本组件,用于显示文本。它支持多种样式,如字体大小、颜色、...

    Android-VerticalMarqueeView-新闻向上不断滚动跑马灯效果

    在Android应用开发中,我们经常会遇到需要展示滚动文字的需求,比如新闻标题的跑马灯效果。在这种场景下,`VerticalMarqueeView`控件就能派上用场。它是一种特殊的视图,允许文本或图像在垂直方向上持续滚动,营造出...

    TextView跑马灯效果2

    【标题】:“TextView跑马灯效果2” 在Android开发中,TextView是我们常用的一个组件,用于显示文本信息。而“跑马灯”效果则是TextView的一种特殊显示方式,它可以使文本在达到TextView宽度边界后,继续从左侧滚动...

    android 自定义跑马灯

    在Android开发中,自定义跑马灯效果是一种常见的UI动态效果,常用于显示滚动文本,如广告栏、通知提示等。跑马灯效果通常是指文本或图片在一个固定区域里不断循环滚动,给人一种视觉上的连续性。本文将深入探讨如何...

    自定义控件_滚动的TextView

    至此,我们就创建了一个基本的跑马灯效果的自定义TextView。开发者可以根据需求进一步优化,例如添加动画效果、调整滚动速度、支持暂停和恢复滚动等功能,以满足更复杂的应用场景。 总结来说,创建自定义控件是...

    Android-MarqueeView新的里程表式垂直跑马灯基于viewgroup的自定义控件

    本文将深入探讨“Android-MarqueeView新的里程表式垂直跑马灯”这一基于ViewGroup的自定义控件,以及如何利用它来增强用户界面的交互体验。 首先,"MarqueeView"这个名称来源于电视屏幕滚动文字的术语“跑马灯”,...

    Android-自定义跑马灯MarqueeView

    - 如果是`TextView`,可以通过设置`android:singleLine="true"`和`android:ellipsize="marquee"`开启跑马灯效果。 - 自定义滚动逻辑时,可以使用`postDelayed`或者`Handler`来定时改变文本的位置,模拟滚动效果。 ...

Global site tag (gtag.js) - Google Analytics