自定義控件
packagecom.nskj.zhiyinglicai.myView;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Camera;
importandroid.graphics.Color;
importandroid.graphics.Matrix;
importandroid.util.AttributeSet;
importandroid.view.Gravity;
importandroid.view.View;
importandroid.view.animation.AccelerateInterpolator;
importandroid.view.animation.Animation;
importandroid.view.animation.Transformation;
importandroid.widget.TextSwitcher;
importandroid.widget.TextView;
importandroid.widget.ViewSwitcher;
importcom.nskj.zhiyinglicai.R;
/**
*TODO 向上滾動TextView
*
*@authorZhaoQy
*/
public classScollViewTextView
extends
TextSwitcher implementsViewSwitcher.ViewFactory {
private floatmHeight;
privateContext
mContext;
// mInUp,mOutUp分別構成向下翻頁的進出動畫
privateRotate3dAnimation
mInUp;
privateRotate3dAnimation
mOutUp;
// mInDown,mOutDown分別構成向下翻頁的進出動畫
privateRotate3dAnimation
mInDown;
privateRotate3dAnimation
mOutDown;
publicScollViewTextView(Context
context) {
this(context,null);
}
publicScollViewTextView(Context
context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.auto3d);
mHeight=20;
a.recycle();
mContext= context;
init();
}
private voidinit()
{
setFactory(this);
mInUp= createAnim(true,true);
mOutUp= createAnim(false,true);
// TextSwitcher主要用於文件切換,比如 從文字A 切換到 文字 B,
// setInAnimation()後,A將執行inAnimation,
// setOutAnimation()後,B將執行OutAnimation
setInAnimation(mInUp);
setOutAnimation(mOutUp);
}
privateRotate3dAnimation
createAnim(booleanturnIn,booleanturnUp)
{
finalRotate3dAnimation
rotation =newRotate3dAnimation(turnIn, turnUp);
// 動畫持續時間
rotation.setDuration(300);
rotation.setFillAfter(false);
rotation.setInterpolator(newAccelerateInterpolator());
returnrotation;
}
// 這裏返回的TextView,就是我們看到的View
@Override
publicView
makeView() {
TextView t =newTextView(mContext);
t.setGravity(Gravity.LEFT);
t.setTextSize(16);
t.setMaxLines(1);
t.setPadding(0,5,0,5);
// 設置文字顏色
t.setTextColor(Color.WHITE);
returnt;
}
// 定義動作,向下滾動翻頁
public voidprevious()
{
if(getInAnimation()
!= mInDown) {
setInAnimation(mInDown);
}
if(getOutAnimation()
!= mOutDown) {
setOutAnimation(mOutDown);
}
}
// 定義動作,向上滾動翻頁
public voidnext()
{
if(getInAnimation()
!= mInUp) {
setInAnimation(mInUp);
}
if(getOutAnimation()
!= mOutUp) {
setOutAnimation(mOutUp);
}
}
classRotate3dAnimationextendsAnimation
{
private floatmCenterX;
private floatmCenterY;
private final booleanmTurnIn;
private final booleanmTurnUp;
privateCameramCamera;
publicRotate3dAnimation(booleanturnIn,booleanturnUp)
{
mTurnIn= turnIn;
mTurnUp= turnUp;
}
@Override
public voidinitialize(intwidth,intheight,intparentWidth,intparentHeight)
{
super.initialize(width,
height, parentWidth, parentHeight);
mCamera=newCamera();
mCenterY= getHeight()
/ 2;
mCenterX= getWidth()
/ 2;
}
@Override
protected voidapplyTransformation(floatinterpolatedTime,
Transformation t) {
final floatcenterX
= mCenterX;
final floatcenterY
= mCenterY;
finalCamera camera
= mCamera;
final intderection
= mTurnUp?1:
-1;
finalMatrix 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);
}
}
}
xml文件
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<com.nskj.zhiyinglicai.myView.ScollViewTextView
android:id="@+id/tv_integral_draw_message"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=""
android:textStyle="bold"
android:gravity="center|left"
android:layout_marginLeft="10dp"
android:textColor="@android:color/white"
android:orientation="vertical"/>
</LinearLayout>
JavaBean文件
importjava.io.Serializable;
public classDrawMessageimplementsSerializable
{
privateStringname;
privateStringmessage;
publicDrawMessage()
{
}
publicDrawMessage(String
name, String message) {
this.name=
name;
this.message=
message;
}
publicString getName()
{
returnname;
}
public voidsetName(String
name) {
this.name=
name;
}
publicString getMessage()
{
returnmessage;
}
public voidsetMessage(String
message) {
this.message=
message;
}
}
activity中應用
public classIntegralDrawActivityextendsCommonActivity
{
private
List<DrawMessage> drawMessageList;
private int
mTextCount;
private
Handler mHandler=newHandler();
List<String> list;
@Override
protected voidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_integral_draw);
initView();
}
public void
initView(){
drawMessageList=newArrayList<>();
drawMessageList.add(newDrawMessage("陌xx","電視機"));
drawMessageList.add(newDrawMessage("陌78","電視機4259"));
drawMessageList.add(newDrawMessage("陌37656","電視45686機"));
drawMessageList.add(newDrawMessage("陌15638+","電576視機"));
for
(inti =0;
i <drawMessageList.size(); i++){
String str =drawMessageList.get(i).getName()
+":獲得"+drawMessageList.get(i).getMessage();
list.add(str);
}
mTextCount=list.size();
mHandler.postDelayed(runnable,2000);
}
Runnable runnable=newRunnable()
{
@Override
public voidrun()
{
tv_integral_draw_message.next();
mTextCount++;
if(mTextCount>=
Integer.MAX_VALUE){
mTextCount=list.size();
}
tv_integral_draw_message.setText(list.get(mTextCount%
(list.size())));
if(list.size()
>1) {
mHandler.postDelayed(this,2000);
}
}
};
}