就是大家叫的跑马灯效果。对4.0以上,简单地在TextView里面加上4句就可以了:

android:ellipsize="marquee"

android:focusable="true"

android:focusableInTouchMode="true"

android:singleLine="true"

但是如果这个TextView属于ListView的子View,并且list item设置了android:descendantFocusability="blocksDescendants"等比较复杂的情况时,上述方法不行。必须在自定义View上drawText,在http://gundumw100.iteye.com/blog/965366的基础上,整理了些干货:

FloatableTextView.java:

package com.example.floatabletextview;

import android.content.Context;

import android.graphics.Canvas;

import android.os.Parcel;

import android.os.Parcelable;

import android.util.AttributeSet;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.TextView;

/**

* 单行TextView,容纳不下就左移

*/

public class FloatableTextView extends TextView implements OnClickListener {

public boolean mIsFloating = false; //是否开始滚动

private float mSpeed = 0.5f;

private float mStep = 0f;

private String mStr = ""; //文本内容

private float mTextLength = 0f; //文本长度

private float mViewWidth = 0f;

private float mY = 0f; //文字的纵坐标

public FloatableTextView(Context context) {

super(context);

initView();

}

public FloatableTextView(Context context, AttributeSet attrs) {

super(context, attrs);

initView();

}

public FloatableTextView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

initView();

}

private void initView() {

setOnClickListener(this);

}

public void init(String str, float speed, float width) {

setText(str);

mSpeed = speed;

mStr = getText().toString();

mTextLength = getPaint().measureText(mStr);

mViewWidth = width;

mStep = mTextLength + mViewWidth;

mY = getTextSize() + getPaddingTop();

getPaint().setColor(0xff0000ff);

}

@Override

public void onClick(View v) {

if (mIsFloating)

stopFloating();

else

startFloating();

}

@Override

public void onDraw(Canvas canvas) {

canvas.drawText(mStr, 0, mStr.length(), mViewWidth + mTextLength - mStep, mY, getPaint());

if (!mIsFloating)

return;

mStep += mSpeed;

if (mStep > mViewWidth + mTextLength * 2)

mStep = mTextLength;

invalidate();

}

@Override

public void onRestoreInstanceState(Parcelable state) {

if (!(state instanceof SavedState)) {

super.onRestoreInstanceState(state);

return;

}

SavedState savedState = (SavedState) state;

super.onRestoreInstanceState(savedState.getSuperState());

mStep = savedState.mStep;

mIsFloating = savedState.mIsFloating;

}

@Override

public Parcelable onSaveInstanceState() {

Parcelable superState = super.onSaveInstanceState();

SavedState savedState = new SavedState(superState);

savedState.mStep = mStep;

savedState.mIsFloating = mIsFloating;

return savedState;

}

public void setSpeed(float speed) {

mSpeed = speed;

}

public void startFloating() {

mIsFloating = mTextLength > mViewWidth;

// mIsFloating = true;

invalidate();

}

public void stopFloating() {

mIsFloating = false;

invalidate();

}

public static class SavedState extends BaseSavedState {

public static final Parcelable.Creator CREATOR = new Parcelable.Creator() {

@Override

public SavedState createFromParcel(Parcel in) {

return new SavedState(in);

}

public SavedState[] newArray(int size) {

return new SavedState[size];

}

};

public boolean mIsFloating = false;

public float mStep = 0.0f;

private SavedState(Parcel in) {

super(in);

boolean[] b = new boolean[1];

in.readBooleanArray(b);

mIsFloating = b[0];

mStep = in.readFloat();

}

SavedState(Parcelable superState) {

super(superState);

}

@Override

public void writeToParcel(Parcel out, int flags) {

super.writeToParcel(out, flags);

out.writeBooleanArray(new boolean[] {

mIsFloating

});

out.writeFloat(mStep);

}

}

}

MainActivity.java:

package com.example.floatabletextview;

import android.app.ListActivity;

import android.os.Bundle;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import com.example.zlistmarquee.R;

public class MainActivity extends ListActivity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

setListAdapter(new MyAdapter());

}

class MyAdapter extends BaseAdapter {

@Override

public int getCount() {

return 9;

}

@Override

public Object getItem(int position) {

return null;

}

@Override

public long getItemId(int position) {

return 0;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View v = getLayoutInflater().inflate(R.layout.list_item, null);

FloatableTextView floatableTextView = (FloatableTextView) v.findViewById(R.id.floatable_text_view);

floatableTextView.init("速度 岁的 电话 离开 的灯光 撒旦斯蒂芬 无污染", 0.9f, 100);

floatableTextView.startFloating();

return v;

}

}

}

list_item.xml:

android:layout_width="match_parent"

android:layout_height="30dp"

android:orientation="horizontal" >

android:layout_width="90dp"

android:layout_height="fill_parent"

android:background="@android:color/holo_green_dark" >

android:id="@+id/floatable_text_view"

android:layout_width="80dp"

android:layout_height="30dp"

android:background="@android:color/holo_blue_bright" />

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="@android:color/holo_green_light" >

activity_main.xml:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent" >

android:id="@android:id/list"

android:layout_width="fill_parent"

android:layout_height="wrap_content" >

android 单行文本滚动,android TextView 容纳不下内容,让字向左滚动的办法相关推荐

  1. 如何快速将合并居中的单行文本变为多行以匹配不同内容

    如何快速将合并居中的单行文本变为多行以匹配不同内容 **问题:**在Excel中将合并居中的单行文本变为多行以匹配不同内容,如下图,如果数量较少,很容易处理,如果数量很多,处理起来相对麻烦,本文尝试用 ...

  2. android 单行文本滚动,Android UI实现单行文本水平触摸滑动效果

    本文实例为大家分享了单行文本水平触摸滑动效果,通过edittext实现textview单行长文本水平滑动效果. 下一篇再为大家介绍 多行文本折叠展开效果,自定义布局view实现多行文本折叠和展开. 1 ...

  3. android设置文本大小属性,TextView文本属性设置

    在Android中,TextView是我们最常用的用来显示文本的控件. 一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及 ...

  4. android 输入法文本选择功能,Android的文本和输入---创建输入法(一)

    输入法编辑器(IME)是让用户输入文本的控件.Android提供了一个可扩展的的输入法的框架,它允许应用程序给用户提供另外的输入法,如软键盘或语音输入.这些输入法一旦安装,用户就可以从系统的设置中选择 ...

  5. android实现文本输入,Android实现智能提示的文本输入框AutoCompleteTextView

    今天我们要讲一个十分简单的内容,就是一个安卓控件的使用,用法很简单,但是很常用的一个.这里我用两种不同的写法来处理.当然,无论用哪一种写法,效果都是一样的. 我们先来看效果图. 要实现这种效果十分简单 ...

  6. android动态文本框,Android文本框实现搜索和清空效果

    本文实现的效果: 文本框输入为空时显示输入的图标:不为空时显示清空的图标,此时点击清空图标能清空文本框内输入文字. 实现效果: 核心代码: package com.example.test; impo ...

  7. android 大文本存储,Android操作文件存储信息 利用SharedReference存储信息(获取SDCARD大小)...

    1.机身内存 package com.pas.loginservice; import java.io.BufferedReader; import java.io.File; import java ...

  8. Android 富文本编辑器 图文混排

    富文本编辑器,如图:    Android 富文本编辑器实现思路: 默认状态下编辑器显示一个EditText,点击图片,选择插入本地图片或者拍照图片. 插入图片时,如果当前位置后面没有文字,则直接插入 ...

  9. android动画平移 加速,Android动画总结

    Android中的动画大致上分为视图动画(View Animation)和属性动画(Property Animation)两种,其中视图动画又分为补间动画(Tween Animation)和帧动画两种 ...

最新文章

  1. 全球富豪大洗牌!马斯克登顶世界首富,黄铮国内第三超马云
  2. 作业五—个人项目-小学四则运算 “软件”之升级版1
  3. php二叉树广度插入数据,php-如何在不使用广度优先遍历的情况下找到二叉树级别k的节点数?...
  4. php扩展库加密如何解密,如何利用Mcrypt扩展库进行加密和解密_PHP教程
  5. html json to table,javascript - HTML - Convert json to table - Stack Overflow
  6. PAT乙级(1034 有理数四则运算)
  7. 《流量的秘密: Google Analytics网站分析与优化技巧(第3版)》一2.2 网站分析中的cookie...
  8. Asp.net AJAX JavaScript 基本类型扩展(7)——String 类型及其扩展
  9. C-Free 5.0最新注册码
  10. UI设计师这个行业到底是做什么的?
  11. ios7禁止屏幕旋转,强制竖屏
  12. 《一舞醉红尘,一笑歌岁月》
  13. vivox27微信无法连接服务器,vivo X27微信拍照模糊怎么办?简单一个操作轻松解决...
  14. 入门PerfDog性能测试
  15. Get请求后端并带参数
  16. 联通家庭宽带开启ipv6
  17. 山东大学软件学院概率论与数理统计
  18. python3打开文件的代码_Python读写文件的代码示例
  19. android盒子分辨率,有趣发现:盒子分辨率需要正确设置
  20. 高级软件工程--平时作业汇总

热门文章

  1. linux命令diff实例,举例说明Linux diff 命令
  2. django python3.6_python3.6在linux持久运行django
  3. iOS Passbook 入门 1/2
  4. [转载]魔兽争霸3技术分析资源汇总 我们不生产魔兽,我们只是魔兽的搬运工
  5. 先尝试一步——简单应用Advanced Installer9.8打包发布vb.net程序(vs2012)
  6. linux洪水攻击软件,Linux服务器下对SYN洪水攻击的诊断和阻挡
  7. 改进StyleGANv2的容貌年龄预测系统
  8. [转].NET 数据访问架构指南
  9. 寻雷-----更新且不完整版
  10. RFID珠宝管理技术应用于新零售行业解决方案