前两天在电脑上使用迅雷的时候发现,现在的迅雷有一个类似弹幕的东西,热门搜索词会循环的在屏幕上飞过,就想能不能做一个安卓的飞屏view,然后在一番尝试后做出来了一个比较像样的demo.然后由于技术有限也没有做深入研究.现在贴上来.
代码思路:
1.整个view是继承relativelayout的ViewGroup,然后飞过的每个”小蜜蜂”是一个textview.
2.ViewGroup需要根据设定的宽高值及飞屏的行数来确定自己的宽高
(当高度为fill_parent 或者 固定值时,如果设置的高度小于要显示的行数*行高,设置间隔高度等于行高,其实这是设置的固定值并不生效)
3.自定义MyTextView继承textView,并添加字段,point来标志自身的位置,speed表示每次更新位置时的增幅,相当于移动速度
4.在ViewGroup中维护两个list,一个表示等待显示的view的集合,一个表示正在显示的view的集合,当需要添加view到ViewGroup时,取waitList中第一个view加入ViewGroup中,然后不断更新正在显示的view的位置信息即可
表达的比较混乱,表达能力不好,但是程序员交流直接看代码就好.上面仅供参考.
FlyingStringLayout代码
package com.example.flyingstring;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.AvoidXfermode.Mode;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class FlyingStringLayout extends RelativeLayout {
private Context mContext;
/**
* 文字的行数(默认3)
*/
private int mStrLineNum = 5;
/**
* 间隔的行数=文字行数 + 1
*/
private int mSeparatorLineNum = mStrLineNum + 1;
/**
* 每行文字的高度
*/
private int mStrLineHeight;
/**
* 间隔的高度
*/
private int mSeparatorHeight;
/**
* 字体大小(sp)
*/
private int mTextSize = 20;
/**
* 画笔
*/
private Paint paint;
private int[] colors = { Color.parseColor("#bb45C9C2"), Color.parseColor("#bb2727E7"), Color.parseColor("#bbEDF21C"), Color.parseColor("#bb8C1AF4"), Color.parseColor("#bb65A967"), Color.parseColor("#bb32DC98"),