android 单行文本滚动,android TextView 容纳不下内容,让字向左滚动的办法
就是大家叫的跑马灯效果。对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 容纳不下内容,让字向左滚动的办法相关推荐
- 如何快速将合并居中的单行文本变为多行以匹配不同内容
如何快速将合并居中的单行文本变为多行以匹配不同内容 **问题:**在Excel中将合并居中的单行文本变为多行以匹配不同内容,如下图,如果数量较少,很容易处理,如果数量很多,处理起来相对麻烦,本文尝试用 ...
- android 单行文本滚动,Android UI实现单行文本水平触摸滑动效果
本文实例为大家分享了单行文本水平触摸滑动效果,通过edittext实现textview单行长文本水平滑动效果. 下一篇再为大家介绍 多行文本折叠展开效果,自定义布局view实现多行文本折叠和展开. 1 ...
- android设置文本大小属性,TextView文本属性设置
在Android中,TextView是我们最常用的用来显示文本的控件. 一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及 ...
- android 输入法文本选择功能,Android的文本和输入---创建输入法(一)
输入法编辑器(IME)是让用户输入文本的控件.Android提供了一个可扩展的的输入法的框架,它允许应用程序给用户提供另外的输入法,如软键盘或语音输入.这些输入法一旦安装,用户就可以从系统的设置中选择 ...
- android实现文本输入,Android实现智能提示的文本输入框AutoCompleteTextView
今天我们要讲一个十分简单的内容,就是一个安卓控件的使用,用法很简单,但是很常用的一个.这里我用两种不同的写法来处理.当然,无论用哪一种写法,效果都是一样的. 我们先来看效果图. 要实现这种效果十分简单 ...
- android动态文本框,Android文本框实现搜索和清空效果
本文实现的效果: 文本框输入为空时显示输入的图标:不为空时显示清空的图标,此时点击清空图标能清空文本框内输入文字. 实现效果: 核心代码: package com.example.test; impo ...
- android 大文本存储,Android操作文件存储信息 利用SharedReference存储信息(获取SDCARD大小)...
1.机身内存 package com.pas.loginservice; import java.io.BufferedReader; import java.io.File; import java ...
- Android 富文本编辑器 图文混排
富文本编辑器,如图: Android 富文本编辑器实现思路: 默认状态下编辑器显示一个EditText,点击图片,选择插入本地图片或者拍照图片. 插入图片时,如果当前位置后面没有文字,则直接插入 ...
- android动画平移 加速,Android动画总结
Android中的动画大致上分为视图动画(View Animation)和属性动画(Property Animation)两种,其中视图动画又分为补间动画(Tween Animation)和帧动画两种 ...
最新文章
- 全球富豪大洗牌!马斯克登顶世界首富,黄铮国内第三超马云
- 作业五—个人项目-小学四则运算 “软件”之升级版1
- php二叉树广度插入数据,php-如何在不使用广度优先遍历的情况下找到二叉树级别k的节点数?...
- php扩展库加密如何解密,如何利用Mcrypt扩展库进行加密和解密_PHP教程
- html json to table,javascript - HTML - Convert json to table - Stack Overflow
- PAT乙级(1034 有理数四则运算)
- 《流量的秘密: Google Analytics网站分析与优化技巧(第3版)》一2.2 网站分析中的cookie...
- Asp.net AJAX JavaScript 基本类型扩展(7)——String 类型及其扩展
- C-Free 5.0最新注册码
- UI设计师这个行业到底是做什么的?
- ios7禁止屏幕旋转,强制竖屏
- 《一舞醉红尘,一笑歌岁月》
- vivox27微信无法连接服务器,vivo X27微信拍照模糊怎么办?简单一个操作轻松解决...
- 入门PerfDog性能测试
- Get请求后端并带参数
- 联通家庭宽带开启ipv6
- 山东大学软件学院概率论与数理统计
- python3打开文件的代码_Python读写文件的代码示例
- android盒子分辨率,有趣发现:盒子分辨率需要正确设置
- 高级软件工程--平时作业汇总
热门文章
- linux命令diff实例,举例说明Linux diff 命令
- django python3.6_python3.6在linux持久运行django
- iOS Passbook 入门 1/2
- [转载]魔兽争霸3技术分析资源汇总 我们不生产魔兽,我们只是魔兽的搬运工
- 先尝试一步——简单应用Advanced Installer9.8打包发布vb.net程序(vs2012)
- linux洪水攻击软件,Linux服务器下对SYN洪水攻击的诊断和阻挡
- 改进StyleGANv2的容貌年龄预测系统
- [转].NET 数据访问架构指南
- 寻雷-----更新且不完整版
- RFID珠宝管理技术应用于新零售行业解决方案