我想问一下我们如何创建Scroll TextView操作栏作为Whatsapp lastseen的状态。 请打开whatsapp,看看状态如何:)
然后它会开始滚动,我们可以看到这样的文字:"昨天在....."
看到答案 0 :(得分:2)
受到this答案的启发,尝试制作此解决方案。希望这对你有用。
步骤1:创建打字机课程。
public class Typewriter extends TextView {
private CharSequence mTextToHide, mTextToDisplay;
private int mIndex;
private long mInitialDelay = 2000; //Default 500ms delay
private long mDelay = 500; //Default 500ms delay
private Handler mHandler = new Handler();
private Runnable characterAdder = new Runnable() {
@Override
public void run() {
// setText(mText.subSequence(0, mIndex++));
// if (mIndex <= mText.length()) {
// mHandler.postDelayed(characterAdder, mDelay);
// }
if (mTextToHide != null
&& mTextToDisplay != null && mIndex < mTextToHide.length()) {
Log.d("Typewriter", "mIndex = " + mIndex);
setText(mTextToDisplay.subSequence(mIndex++, mTextToDisplay.length()));
mHandler.postDelayed(characterAdder, mDelay);
}
}
};
public Typewriter(Context context) {
super(context);
}
public Typewriter(Context context, AttributeSet attrs) {
super(context, attrs);
}
public void animateText(CharSequence textToHide, String textToDisplay) {
mTextToHide = textToHide;
mTextToDisplay = textToDisplay;
mIndex = 0;
// setText("");
setText(textToDisplay);
mHandler.removeCallbacks(characterAdder);
mHandler.postDelayed(characterAdder, mInitialDelay);
}
public void setCharacterDelay(long millis) {
mDelay = millis;
}
public void setInitialDelay(long millis) {
mInitialDelay = millis;
}
}
步骤2:在xml中扩展它以代替TextView。将com.abc.xyz替换为相应的包名称。
<com.abc.xyz.Typewriter
android:id="@+id/txtAppTitle"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:layout_gravity="left"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:singleLine="true"
android:textColor="@color/white"
android:textSize="@dimen/font_size_toolbar_title" />
步骤3:设置活动或片段类的值。根据您的要求设置参数。
public static String LAST_SEEN_TEXT = "last seen ";
public static String TIME_TEXT = "yesterday at 15:43";
private Typewriter txtAppTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
...
txtAppTitle = (Typewriter) findViewById(R.id.txtAppTitle);
// Start after 2000ms
txtAppTitle.setInitialDelay(2000);
// Remove a character every 150ms
txtAppTitle.setCharacterDelay(250);
txtAppTitle.animateText(LAST_SEEN_TEXT, LAST_SEEN_TEXT + TIME_TEXT);
...
}
答案 1 :(得分:1)
添加以下属性:
<TextView
android:text="text"
android:id="@+id/marquee_text"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit=""//once or marquee_forever
android:scrollHorizontally="true"
android:paddingLeft="15dip"
android:paddingRight="15dip"
android:focusable="true"
android:focusableInTouchMode="true"
android:freezesText="true">
答案 2 :(得分:1)
使用选取框进行文本视图。
<TextView
android:text="Really Long Scrolling Text Goes Here.... ..... ............ .... ...."
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="1"
android:scrollHorizontally="true"
android:id="@+id/TextView03"
android:padding="5dip"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
在java文件中,您可以检查文本是否完全滚动。并设置 RepeatLimit一次并将 textview单行设置为。并设置图像右侧。
TextView tv = (TextView) this.findViewById(R.id.TextView03);
tv.setSelected(true);
我认为这将解决您的问题。
答案 3 :(得分:0)
只需将以下属性添加到TextView
,然后就可以正常使用:
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit ="1"
android:scrollHorizontally="true"
android:focusable="true"
android:focusableInTouchMode="true"
您必须在Java代码中定义TextView.setSelected(true);
以下是Android文档中上述属性的说明:
<强>
android:marqueeRepeatLimit
强>重复选框动画的次数。仅适用于 TextView已启用选框。
可以是整数值,例如&#34; 100&#34;。
<强>
android:ellipsize
强>如果设置,则会导致比视图宽的单词 椭圆化而不是在中间破碎。你经常也会想要 设置scrollHorizontally或singleLine以使文本为 整体也被限制在一条线而不是仍被允许 分成多行。
修改强>
您可以将android:marqueeRepeatLimit
属性的值设置为1,只滚动一次,然后停止。
我希望它可以帮到你。
答案 4 :(得分:0)
这是你的完美答案。
尝试以下代码:
public class MarqueeLayoutActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView textView = new TextView(this);
textView.setText("I'm the fancy MarqueeLayout.");
MarqueeLayout marqueeLayout = new MarqueeLayout(this);
marqueeLayout.setDuration(10000);
marqueeLayout.addView(textView);
marqueeLayout.startAnimation();
setContentView(marqueeLayout);
}
}
包含文本动画的类:
public class MarqueeLayout extends FrameLayout {
private Animation animation;
public MarqueeLayout(Context context) {
super(context);
animation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, +0.4f,
Animation.RELATIVE_TO_SELF, -0.2f,
Animation.RELATIVE_TO_SELF, 0f,
Animation.RELATIVE_TO_SELF, 0f
);
animation.setRepeatCount(Animation.ABSOLUTE);
animation.setRepeatMode(Animation.ABSOLUTE);
animation.setFillAfter(true);
}
public void setDuration(int durationMillis) {
animation.setDuration(durationMillis);
}
public void startAnimation() {
startAnimation(animation);
}
}
答案 5 :(得分:0)
我的解决方案:
final TextView textView = (TextView)findViewById(R.id.text);
textView.setSingleLine();
textView.animate()
.translationX(dip2px(MainActivity.this, -100))
.setDuration(200)
.setInterpolator(new AccelerateDecelerateInterpolator())
.setStartDelay(2000)
.start();
ValueAnimator anim= ValueAnimator.ofInt(textView.getMaxWidth(),textView.getMaxWidth()+ dip2px(MainActivity.this, 200));
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value = (int) animation.getAnimatedValue();
textView.setMaxWidth(value);
}
});
anim.setDuration(200);
anim.setStartDelay(2000);
anim.start();
DP到PX方法:
public static int dip2px(Context context, float dipValue) {
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dipValue, context.getResources().getDisplayMetrics());
}
示例XML:
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxWidth="120dp"
android:ellipsize="end"
android:text="Hello World!, Hello World!" />
您可以为布局设置值。