package fan.textscrollanimdemo;
import android.content.Context;
import android.graphics.Camera;
import android.graphics.Color;
import android.graphics.Matrix;
import android.os.Handler;
import android.os.Message;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextSwitcher;
import android.widget.TextView;
import android.widget.ViewSwitcher;
/**
* 滚动的TextView
*/
public class ScrollTextView extends TextSwitcher implements ViewSwitcher.ViewFactory {
private Context mContext;
//mInUp,mOutUp分别构成向下翻页的进出动画
private Rotate3dAnimation mInUp;
private Rotate3dAnimation mOutUp;
private boolean toRun;
private static int RUN = 9527;
/**
* 滚动间隔
*/
private int mScrollInterval = 3000;
/**
* 轮播文字数组
*/
private String[] mItems;
/**
* 当前显示的位置
*/
private int mPosition;
public ScrollTextView(Context context) {
this(context, null);
}
public ScrollTextView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
init();
}
private void init() {
setFactory(this);
mInUp = createAnim(true, true);
mOutUp = createAnim(false, true);
setInAnimation(mInUp);//当View显示时动画资源ID
setOutAnimation(mOutUp);//当View隐藏是动画资源ID。
}
private Rotate3dAnimation createAnim( boolean turnIn, boolean turnUp){
Rotate3dAnimation rotation = new Rotate3dAnimation(turnIn, turnUp);
rotation.setDuration(300);//执行动画的时间
rotation.setFillAfter(false);//是否保持动画完毕之后的状态
rotation.setInterpolator(new AccelerateInterpolator());//设置加速模式
return rotation;
}
//这里返回的TextView,就是我们看到的View,可以设置自己想要的效果
public View makeView() {
TextView textView = new TextView(mContext);
textView.setGravity(Gravity.LEFT);
textView.setTextSize(20);
textView.setSingleLine(true);
textView.setGravity(Gravity.CENTER_VERTICAL);
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setTextColor(Color.BLACK);
return textView;
}
/**
* 设置轮播文字数组
*/
public void setItems(String[] mItems){
if(mItems == null){
throw new IllegalArgumentException("轮播文字数组不能为null!");
}
this.mItems = mItems;
mPosition = 0;
if(mItems.length > 0){
setText(mItems[mPosition]);
}else{
throw new IllegalArgumentException("轮播文字数组没有内容!");
}
}
/**
* 开始滚动
*/
public void startScroll(){
checkArray();
toRun = true;
handler.sendEmptyMessageDelayed(RUN,mScrollInterval);
}
/**
* 开始滚动
* @param mScrollInterval 再次滚动间隔,默认3000ms
*/
public void startScroll(int mScrollInterval){
checkArray();
this.mScrollInterval = mScrollInterval;
toRun = true;
handler.sendEmptyMessageDelayed(RUN,mScrollInterval);
}
/**
* 设置再次滚动间隔
* @param mScrollInterval 滚动持续时间,默认300ms
*/
public void setScrollInterval(int mScrollInterval){
this.mScrollInterval = mScrollInterval;
}
/**
* 获取当前位置
* @return
*/
public int getCurrentPosition(){
return mPosition;
}
/**
* 停止滚动
*/
public void stopScroll(){
toRun = false;
}
private Handler handler = new Handler() {
public void handleMessage(Message msg) {
if (msg.what == RUN) {
if(toRun){
mPosition++;
if(mPosition == mItems.length){
mPosition = 0;
}
setText(mItems[mPosition]);
handler.sendEmptyMessageDelayed(RUN,mScrollInterval);
}
}
}
};
/**
* 校验数组是否为空
*/
private void checkArray(){
if(mItems == null){
throw new IllegalArgumentException("没有设置轮播文字数组或轮播文字数组不能为null!");
}
if(mItems.length < 1){
throw new IllegalArgumentException("轮播文字数组没有内容!");
}
}
class Rotate3dAnimation extends Animation {
private float mCenterX;
private float mCenterY;
private final boolean mTurnIn;
private final boolean mTurnUp;
private Camera mCamera;
public Rotate3dAnimation(boolean turnIn, boolean turnUp) {
mTurnIn = turnIn;
mTurnUp = turnUp;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
mCamera = new Camera();
mCenterY = getHeight() ;
mCenterX = getWidth() ;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
final float centerX = mCenterX ;
final float centerY = mCenterY ;
final Camera camera = mCamera;
final int derection = mTurnUp ? 1: -1;
final Matrix matrix = t.getMatrix();
camera.save();
if (mTurnIn) {
camera.translate(0.0f, derection *mCenterY * (interpolatedTime - 1.0f), 0.0f);
} else {
camera.translate(0.0f, derection *mCenterY * (interpolatedTime), 0.0f);
}
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
TextScrollPlay.rar (30个子文件)
TextScrollAnimDemo
gradlew 5KB
settings.gradle 16B
build
intermediates
dex-cache
cache.xml 64B
generated
mockable-android-23.jar 22.2MB
gradle
wrapper
gradle-wrapper.properties 231B
gradle-wrapper.jar 52KB
gradlew.bat 2KB
gradle.properties 872B
.gitignore 105B
app
src
androidTest
java
fan
textscrollanimdemo
ApplicationTest.java 365B
test
java
fan
textscrollanimdemo
ExampleUnitTest.java 329B
main
AndroidManifest.xml 681B
res
mipmap-hdpi
ic_launcher.png 3KB
mipmap-xxxhdpi
ic_launcher.png 10KB
mipmap-xhdpi
ic_launcher.png 5KB
mipmap-mdpi
ic_launcher.png 2KB
drawable
layout
activity_main.xml 776B
values-w820dp
dimens.xml 364B
values
colors.xml 214B
strings.xml 84B
styles.xml 394B
dimens.xml 216B
mipmap-xxhdpi
ic_launcher.png 8KB
java
fan
textscrollanimdemo
MainActivity.java 848B
ScrollTextView.java 6KB
libs
.gitignore 8B
build.gradle 649B
proguard-rules.pro 696B
build.gradle 521B
Demo.apk 1.18MB
共 30 条
- 1
资源评论
- yx12345000002018-03-29下来看看,希望可以
F-Fan
- 粉丝: 114
- 资源: 52
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 杨辉三角(Pascal's Triangle)是一个在数学中非常著名的数列,它以一种特定的模式排列数字,内容以5种代码实例实现
- yolov5数据集:CT图像肾脏、结石检测(2类别,包含训练集、验证集)
- 电力102规约请求报文实录
- RTL8723 linux+安卓驱动 2020版本
- ISO 26262 道路车辆-功能安全-系统级产品开发
- 数据挖掘期末题 选择填空简答
- EKF在CTRV模型上的建模推导
- 用于:https://laoshifu.blog.csdn.net/article/details/138191428 多层创建
- 电力102规约(电能累计量的传输规约)培训
- 「常用」E9外部流程接口
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功