Android TextView竖直滚动文字广告效果
2016-01-18 10:31
489 查看
项目需要TextView单行竖直滚动文字广告效果,很简单的功能在网上找了很多没有想要的效果。
开始找到的http://www.cnblogs.com/vaiyanzi/archive/2011/12/06/2277791.html,歌词效果,对代码处理一下变成单行后,发现没有的动态动态滚动的效果,只有文字的瞬间切换。
后来又找到了http://blog.csdn.net/ville_zeng/article/details/8953140,3d滚动效果。我只想要一个简单的滚动就这么难吗,好吧接着改代码吧。还是很感谢博主的,最后还是在这篇文章的基础上修改的。直接上代码。
1、自定义TextView:
package com.cx.textviewverticalrolling;
import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
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;
public class AutoTextView extends TextSwitcher implements
ViewSwitcher.ViewFactory {
private float mHeight = 10;
private Context mContext;
//mInUp,mOutUp分别构成向下翻页的进出动画
private Animation mInUp;
private Animation mOutUp;
//mInDown,mOutDown分别构成向下翻页的进出动画
private Animation mInDown;
private Animation mOutDown;
public AutoTextView(Context context) {
this(context, null);
// TODO Auto-generated constructor stub
}
public AutoTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
mContext = context;
init();
}
private void init() {
// TODO Auto-generated method stub
setFactory(this);
mInUp = createAnim(0, 0 , true, true);
mOutUp = createAnim(0, 0, false, true);
mInDown = createAnim(90, 0 , true , false);
mOutDown = createAnim(0, -90, false, false);
setInAnimation(mInUp);
setOutAnimation(mOutUp);
}
private Animation createAnim(float start, float end, boolean turnIn, boolean turnUp){
final Animation rotation = new Rotate3dAnimation(start, end, turnIn, turnUp);
rotation.setDuration(1000);
rotation.setFillAfter(false);
rotation.setInterpolator(new AccelerateInterpolator());
return rotation;
}
//这里返回的TextView,就是我们看到的View
@Override
public View makeView() {
// TODO Auto-generated method stub
TextView t = new TextView(mContext);
t.setGravity(Gravity.CENTER_VERTICAL);
t.setTextSize(mHeight);
t.setMaxLines(1);
return t;
}
//定义动作,向下滚动翻页
public void previous(){
if(getInAnimation() != mInDown){
setInAnimation(mInDown);
}
if(getOutAnimation() != mOutDown){
setOutAnimation(mOutDown);
}
}
//定义动作,向上滚动翻页
public void next(){
if(getOutAnimation() != mOutUp){
setOutAnimation(mOutUp);
}
if(getInAnimation() != mInUp){
setInAnimation(mInUp);
}
}
class Rotate3dAnimation extends Animation {
private final float mFromDegrees;
private final float mToDegrees;
private float mCenterX;
private float mCenterY;
private final boolean mTurnIn;
private final boolean mTurnUp;
private Camera mCamera;
public Rotate3dAnimation(float fromDegrees, float toDegrees, boolean turnIn, boolean turnUp) {
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
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() / 2;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
final float fromDegrees = mFromDegrees;
float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);
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.rotateX(degrees);
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
}
}
2、布局文件:
package com.cx.textviewverticalrolling;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
public class MainActivity extends Activity {
private Handler handler = new Handler();
private AutoTextView autoTextView;
private int count = 0;
private List<String> arrList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData();
autoTextView = (AutoTextView) findViewById(R.id.autoTextView);
handler.postDelayed(runnable, 0);
}
private void getData() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
arrList.add("竖直滚动TextView-数据" + i);
}
}
Runnable runnable = new Runnable() {
@Override
public void run() {
// handler自带方法实现定时器
try {
handler.postDelayed(this, 3000);
autoTextView.next();
autoTextView.setText(arrList.get(count % arrList.size()));
count++;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}
源码下载
开始找到的http://www.cnblogs.com/vaiyanzi/archive/2011/12/06/2277791.html,歌词效果,对代码处理一下变成单行后,发现没有的动态动态滚动的效果,只有文字的瞬间切换。
后来又找到了http://blog.csdn.net/ville_zeng/article/details/8953140,3d滚动效果。我只想要一个简单的滚动就这么难吗,好吧接着改代码吧。还是很感谢博主的,最后还是在这篇文章的基础上修改的。直接上代码。
1、自定义TextView:
package com.cx.textviewverticalrolling;
import android.content.Context;
import android.graphics.Camera;
import android.graphics.Matrix;
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;
public class AutoTextView extends TextSwitcher implements
ViewSwitcher.ViewFactory {
private float mHeight = 10;
private Context mContext;
//mInUp,mOutUp分别构成向下翻页的进出动画
private Animation mInUp;
private Animation mOutUp;
//mInDown,mOutDown分别构成向下翻页的进出动画
private Animation mInDown;
private Animation mOutDown;
public AutoTextView(Context context) {
this(context, null);
// TODO Auto-generated constructor stub
}
public AutoTextView(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
mContext = context;
init();
}
private void init() {
// TODO Auto-generated method stub
setFactory(this);
mInUp = createAnim(0, 0 , true, true);
mOutUp = createAnim(0, 0, false, true);
mInDown = createAnim(90, 0 , true , false);
mOutDown = createAnim(0, -90, false, false);
setInAnimation(mInUp);
setOutAnimation(mOutUp);
}
private Animation createAnim(float start, float end, boolean turnIn, boolean turnUp){
final Animation rotation = new Rotate3dAnimation(start, end, turnIn, turnUp);
rotation.setDuration(1000);
rotation.setFillAfter(false);
rotation.setInterpolator(new AccelerateInterpolator());
return rotation;
}
//这里返回的TextView,就是我们看到的View
@Override
public View makeView() {
// TODO Auto-generated method stub
TextView t = new TextView(mContext);
t.setGravity(Gravity.CENTER_VERTICAL);
t.setTextSize(mHeight);
t.setMaxLines(1);
return t;
}
//定义动作,向下滚动翻页
public void previous(){
if(getInAnimation() != mInDown){
setInAnimation(mInDown);
}
if(getOutAnimation() != mOutDown){
setOutAnimation(mOutDown);
}
}
//定义动作,向上滚动翻页
public void next(){
if(getOutAnimation() != mOutUp){
setOutAnimation(mOutUp);
}
if(getInAnimation() != mInUp){
setInAnimation(mInUp);
}
}
class Rotate3dAnimation extends Animation {
private final float mFromDegrees;
private final float mToDegrees;
private float mCenterX;
private float mCenterY;
private final boolean mTurnIn;
private final boolean mTurnUp;
private Camera mCamera;
public Rotate3dAnimation(float fromDegrees, float toDegrees, boolean turnIn, boolean turnUp) {
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
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() / 2;
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
final float fromDegrees = mFromDegrees;
float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);
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.rotateX(degrees);
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
}
}
2、布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#000" > <com.cx.textviewverticalrolling.AutoTextView android:id="@+id/autoTextView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="#fff" > </com.cx.textviewverticalrolling.AutoTextView> </RelativeLayout>3、主界面添加数据,设置定时器。
package com.cx.textviewverticalrolling;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
public class MainActivity extends Activity {
private Handler handler = new Handler();
private AutoTextView autoTextView;
private int count = 0;
private List<String> arrList = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getData();
autoTextView = (AutoTextView) findViewById(R.id.autoTextView);
handler.postDelayed(runnable, 0);
}
private void getData() {
// TODO Auto-generated method stub
for (int i = 0; i < 10; i++) {
arrList.add("竖直滚动TextView-数据" + i);
}
}
Runnable runnable = new Runnable() {
@Override
public void run() {
// handler自带方法实现定时器
try {
handler.postDelayed(this, 3000);
autoTextView.next();
autoTextView.setText(arrList.get(count % arrList.size()));
count++;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
};
}
源码下载
相关文章推荐
- Android实现EditText中添加和删除bitmap的方法
- 学习Android Material Design(RecyclerView代替ListView)
- 常用Android开发组件之文本类组件
- Android开发:彻底更改工程名
- 基础篇_浅谈Android 布局
- android 基础(一):activity启动方式standard、singleTop、singleTaste、singleInstance
- Android实现圆形图片
- adb、sqlite3操作android数据库
- Android项目实战之仿网易新闻的页面(RecyclerView )
- Android实现内存中数据保存到sdcard的方法
- 修改apk的包名
- Android 开发绕不过的坑:你的 Bitmap 究竟占多大内存?
- Android开发之禁止下拉通知栏的方法
- Android M 新的运行时权限开发者需要知道的一切
- 提高android数据库性能,GreenDao初步使用
- Android仿搜狗浏览器加载动画
- 专访罗升阳:老罗的Android之旅
- Android Design Support Library——Navigation View
- Android 滚动字幕实现
- android 画笔 Paint set方法汇总