- 浏览: 61821 次
- 性别:
- 来自: 湖南
最新评论
-
Neacy_Zz:
有些Android也可以显示的出来。
Android 将一张CMYK模式的图片转换成RGB模式的图片 -
hold_on:
AsyncTask 2.3 和 4.0稍有不同
Android从零开始(十五)
N久没有跟新了,最近做的银行项目中的一个自定义控件(用于状态栏欢迎语句+柜员信息的滚动,简单点说就是TextView跑马灯效果)
layout中引用:
源码下载请戳这里:
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>
源码下载请戳这里:
- ScrollTextView.zip (2 KB)
- 下载次数: 7
发表评论
-
Android自定义控件--3(刷新动画)
2014-02-26 11:14 947一个乐动力的刷新动画 package com.example. ... -
Android自定义控件--2(数字签名)
2014-02-26 11:08 922客户信息交互用到的一个数字签名,保存的是bmp图片(我那会在P ... -
Android 将一张CMYK模式的图片转换成RGB模式的图片
2013-06-25 17:32 2220Android系统是不能够显示打印模式(CMYK)的图片的。所 ... -
Android TextToSpeech语音播放文本
2013-06-25 17:17 1855步骤一、初始化 package com.example.spe ... -
Android连接电脑eclipse无法识别=解决办法
2013-05-23 09:25 21431、方法一:“我的电脑”-->“属性”-->“设备 ... -
Android BaseAdapter如何获得每一项并添加按钮事件
2013-05-21 15:11 3735package com.hangcheng; impor ... -
Android的VideoView如何循环播放
2013-05-15 14:01 4833package com.hangcheng; impor ... -
Android如何获取asset目录下所有文件的路径
2013-05-15 09:48 7696package com.hangcheng.util; ... -
Android--WebView+HTML+Javascript
2013-04-09 17:17 1711知识点:android的WebView控件加载HTML并通过j ... -
VideoView重绘
2013-04-01 23:39 1331知识点:Android中的VideoView控件默认情况下是不 ... -
Android从零开始—多媒体(二十二)
2013-03-06 21:43 1033知识点:音乐播放、录音、播放视频、录像、拍照 步骤一、主界面 ... -
Android从零开始—监听广播BroadcastReceiver(二十一)
2013-03-05 10:17 2085知识点:电话拒接+短息 ... -
Android从零开始—电话+短信(二十)
2013-03-05 10:03 1138知识点:系统电话号码和短信的获取(最好用真机,模拟器上木有电话 ... -
Android从零开始(十九)
2013-02-27 10:35 964知识点:back键的处理(有时候我们可能会不小心按了回退键,但 ... -
Android从零开始(十八)
2013-02-27 10:24 843知识点:菜单(menu) 步骤一、创建菜单项(核心代码如下) ... -
Android从零开始(十七)
2013-02-27 10:09 950知识点:抽屉(SlidingDrawer) 先看一下抽屉打开 ... -
Android从零开始(十六)
2013-02-26 19:43 848知识点:闪屏(通常在 ... -
Android从零开始(十五)
2013-02-26 18:32 1092知识点:异步任务AsyncTa ... -
Android从零开始(十四)
2013-02-26 17:16 836知识点:TabHost选项卡之 ... -
Android从零开始(十三)
2013-02-23 22:57 816知识点:TabHost 效果图: 工程目录结构: ...
相关推荐
Android中继承TextView实现文字的跑马灯效果,详细了解请移步http://blog.csdn.net/zxc514257857/article/details/70184606
好像跑马灯这种效果已经不用咱们来实现了 呵呵 不过有一点 如果文字不过长 在组件的范围内 还想要跑马灯的效果怎么办呢 当然的自己自定义啦 那还能怎么做 哈哈 ">android:ellipsize设置当文字过长时 该控件该如何...
人生中第一篇博客便是关于TextView跑马灯的实现,但是随着知识的增多,实现一些功能的方式方法也增多了起来,这里只是自定义控件一个例子,可以同理到很多控件上! 首先写一个类继承你需要重写的控件 比如我这里是...
本文为大家分享一个非常简单但又很常用的控件,跑马灯状态的TextView。当要显示的文本长度太长,又不想换行时用它来显示文本,一来可以完全的显示出文本,二来效果也挺酷,实现起来超级简单,所以,何乐不为。先看下...
android自带的TextView可以实现跑马灯效果,但是有很多的局限性;比如需要设置ellipsize=”marquee”,获取 focusable=”true”,设置singleLine=”true”,控件里的内容需要超过控件本身的长度,无法控制滚动速度和...
大家知道,横向的跑马灯android自带的TextView就可以实现,详情请百度【Android跑马灯效果】。但是竖直的跑马灯效果原生Android是不支持的。网上也有很多网友实现了自定义的效果,但是我一贯是不喜欢看别人的代码,...
|--TextView单行跑马灯效果 |--TextView虚拟获得焦点 |--uploadServlet |--uri之表示资源resource |--ViewPage的使用 |--view中的tag用法之存储对象 |--view常用属性 |--xml常用属性 |--xml文件的pull解析与序列化...
在很多天气或者新闻的应用中,我们都能看到一些字幕滚动的效果,最简单的实现为跑马灯效果,用系统提供的属性即可实现. 复杂一些的就需要自己去用自定义控件实现. 比如 让TextView 实现垂直滚动. 这里我要讲的是垂直...
跑马灯效果textview 来自酷安开源协议 带动画的textview 来自酷安开源协议 自定义省略号的textview 来自酷安开源协议 跑马灯 3.2k 来自awesome-android-ui github最强大的开源项目收集者 36k 文字拓展视图、类似...