您的位置:首页 > 移动开发 > Android开发

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、布局文件:
<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();
}
}
};
}
源码下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: