Android TextView滚动的两种方案

方案有两个

  • 1使用Android原生TextView,优点是简单,缺点是一旦失去焦点,就无法滚动了。
  • 2自定义TextView,缺点是稍微麻烦点,优点是可以一直滚动。

方案1 使用Android原生TextView

布局

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:singleLine="true"
        android:text="这是超长文本这是超长文本这是超长文本这是超长文本这是超长文本这是超长文本这是超长文本这是超长文本" />

android:ellipsize=”marquee”
//滚动属性
android:focusable=”true”
android:focusableInTouchMode=”true”
//使TextView获取焦点,以便滚动
android:singleLine=”true”
//不设置一行显示是无法滚动的

Java代码

TextView tv = null; 
tv = (TextView) findViewById(R.id.tv);
//后来发现上面这一段是废话,可以不写

网上所说的
tv.setMovementMethod(ScrollingMovementMethod.getInstance());
该方法不写仍然可以滚动

该方案一旦其他控件获得焦点,滚动立即停止

方案2 使用自定义TextView

参考:
http://blog.csdn.net/hua631150873/article/details/73469604

Java代码

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.TextView;

/**
 * 
 * @author zhanghuagang
 * 
 */
public class AutoMarqueeTextView extends TextView {

    public AutoMarqueeTextView(Context context) {
        super(context);
        setFocusable(true);// 在每个构造方法中,将TextView设置为可获取焦点
    }

    public AutoMarqueeTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        setFocusable(true);
    }

    public AutoMarqueeTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setFocusable(true);
    }

    @Override
    public boolean isFocused() {// 这个方法必须返回true,制造假象,当系统调用该方法的时候,会一直以为TextView已经获取了焦点
        return true;
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction,
            Rect previouslyFocusedRect) {// 这个方法必须删除其方法体内的实现,也就是让他空实现,也就是说,TextView的焦点获取状态永远都不会改变
    }

}

布局

    <com.example.testan.AutoMarqueeTextView
        android:id="@+id/auto"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:text="这是超长文本这是超长文本这是超长文本这是超长文本这是超长文本这是超长文本这是超长文本这是超长文本" />

这里就不需要再获取焦点了

以上是滚动一次完成就停止滚动,如果想永久滚动可在xml添加

android:marqueeRepeatLimit="marquee_forever"

代码已经上传
http://download.csdn.net/download/u011109881/9967405

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要实现`TextView`文字滚动时颜色渐变的效果,可以使用`LinearGradient`和`Matrix`来实现。 具体实现步骤如下: 1. 定义一个`LinearGradient`对象,用于存储渐变颜色信息。 ```java int[] colors = {Color.BLACK, Color.WHITE, Color.BLACK}; // 定义渐变颜色 float[] positions = {0f, 0.5f, 1f}; // 定义渐变颜色位置 LinearGradient gradient = new LinearGradient(0, 0, textView.getWidth(), 0, colors, positions, Shader.TileMode.CLAMP); // 创建线性渐变对象 ``` 2. 定义一个`Matrix`对象,用于控制文字的绘制。 ```java Matrix matrix = new Matrix(); matrix.setTranslate(textView.getWidth(), 0); // 设置初始位置 ``` 3. 在`TextView`的`onDraw()`方法中,使用`Paint`对象设置渐变和矩阵,并调用`canvas.drawText()`方法绘制文字。 ```java Paint paint = textView.getPaint(); paint.setShader(gradient); paint.getShader().setLocalMatrix(matrix); canvas.drawText(textView.getText().toString(), 0, textView.getHeight() / 2, paint); ``` 4. 在`TextView`的`onSizeChanged()`方法中,重新设置`LinearGradient`和`Matrix`对象的参数。 ```java @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); int[] colors = {Color.BLACK, Color.WHITE, Color.BLACK}; float[] positions = {0f, 0.5f, 1f}; gradient = new LinearGradient(0, 0, w, 0, colors, positions, Shader.TileMode.CLAMP); matrix = new Matrix(); matrix.setTranslate(w, 0); } ``` 完整代码示例: ```java public class GradientTextView extends androidx.appcompat.widget.AppCompatTextView { private LinearGradient gradient; private Matrix matrix; public GradientTextView(Context context) { super(context); } public GradientTextView(Context context, AttributeSet attrs) { super(context, attrs); } public GradientTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onDraw(Canvas canvas) { Paint paint = getPaint(); paint.setShader(gradient); paint.getShader().setLocalMatrix(matrix); canvas.drawText(getText().toString(), 0, getHeight() / 2, paint); invalidate(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { int[] colors = {Color.BLACK, Color.WHITE, Color.BLACK}; float[] positions = {0f, 0.5f, 1f}; gradient = new LinearGradient(0, 0, w, 0, colors, positions, Shader.TileMode.CLAMP); matrix = new Matrix(); matrix.setTranslate(w, 0); } } ``` 使用方法: ```xml <com.example.GradientTextView android:id="@+id/gradient_text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/lorem_ipsum" android:textColor="@android:color/black" android:textSize="24sp" /> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值