我们可以创建Scroll TextView作为whatsapp lastseen的状态

时间:2016-01-12 06:51:32

标签: android whatsapp

我想问一下我们如何创建Scroll TextView操作栏作为Whatsapp lastseen的状态。 请打开whatsapp,看看状态如何:)

在: enter image description here

然后它会开始滚动,我们可以看到这样的文字:"昨天在....."

看到

滚动后: enter image description here

6 个答案:

答案 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

     

如果设置,则会导致比视图宽的单词   椭圆化而不是在中间破碎。你经常也会想要   设置scrollHorizo​​ntally或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!" />

您可以为布局设置值。