自定义控件
package
com.nskj.zhiyinglicai.myView;
import
android.content.Context;
import
android.content.res.TypedArray;
import
android.graphics.Camera;
import
android.graphics.Color;
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;
import
com.nskj.zhiyinglicai.R;
/**
*
TODO 向上滚动TextView
*
*
@author
ZhaoQy
*/
public class
ScollViewTextView
extends
TextSwitcher
implements
ViewSwitcher.ViewFactory {
private float
mHeight
;
private
Context
mContext
;
// mInUp,mOutUp分别构成向下翻页的进出动画
private
Rotate3dAnimation
mInUp
;
private
Rotate3dAnimation
mOutUp
;
// mInDown,mOutDown分别构成向下翻页的进出动画
private
Rotate3dAnimation
mInDown
;
private
Rotate3dAnimation
mOutDown
;
public
ScollViewTextView(Context context) {
this
(context,
null
);
}
public
ScollViewTextView(Context context, AttributeSet attrs) {
super
(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.
auto3d
);
mHeight
=
20
;
a.recycle();
mContext
= context;
init();
}
private void
init() {
setFactory(
this
);
mInUp
= createAnim(
true
,
true
);
mOutUp
= createAnim(
false
,
true
);
// TextSwitcher主要用于文件切换,比如 从文字A 切换到 文字 B,
// setInAnimation()后,A将执行inAnimation,
// setOutAnimation()后,B将执行OutAnimation
setInAnimation(
mInUp
);
setOutAnimation(
mOutUp
);
}
private
Rotate3dAnimation createAnim(
boolean
turnIn,
boolean
turnUp) {
final
Rotate3dAnimation rotation =
new
Rotate3dAnimation(turnIn, turnUp);
// 动画持续时间
rotation.setDuration(
300
);
rotation.setFillAfter(
false
);
rotation.setInterpolator(
new
AccelerateInterpolator());
return
rotation;
}
// 这里返回的TextView,就是我们看到的View
@Override
public
View makeView() {
TextView t =
new
TextView(
mContext
);
t.setGravity(Gravity.
LEFT
);
t.setTextSize(
16
);
t.setMaxLines(
1
);
t.setPadding(
0
,
5
,
0
,
5
);
// 设置文字颜色
t.setTextColor(Color.
WHITE
);
return
t;
}
// 定义动作,向下滚动翻页
public void
previous() {
if
(getInAnimation() !=
mInDown
) {
setInAnimation(
mInDown
);
}
if
(getOutAnimation() !=
mOutDown
) {
setOutAnimation(
mOutDown
);
}
}
// 定义动作,向上滚动翻页
public void
next() {
if
(getInAnimation() !=
mInUp
) {
setInAnimation(
mInUp
);
}
if
(getOutAnimation() !=
mOutUp
) {
setOutAnimation(
mOutUp
);
}
}
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() /
2
;
mCenterX
= getWidth() /
2
;
}
@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);
}
}
}
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文件
import
java.io.Serializable;
public class
DrawMessage
implements
Serializable {
private
String
name
;
private
String
message
;
public
DrawMessage() {
}
public
DrawMessage(String name, String message) {
this
.
name
= name;
this
.
message
= message;
}
public
String getName() {
return
name
;
}
public void
setName(String name) {
this
.
name
= name;
}
public
String getMessage() {
return
message
;
}
public void
setMessage(String message) {
this
.
message
= message;
}
}
activity中应用
public class
IntegralDrawActivity
extends
CommonActivity {
private
List<DrawMessage>
drawMessageList
;
private int
mTextCount
;
private
Handler
mHandler
=
new
Handler();
List<String>
list
;
@Override
protected void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_integral_draw
);
initView();
}
public void
initView(){
drawMessageList
=
new
ArrayList<>();
drawMessageList
.add(
new
DrawMessage(
"陌xx"
,
"电视机"
));
drawMessageList
.add(
new
DrawMessage(
"陌78"
,
"电视机4259"
));
drawMessageList
.add(
new
DrawMessage(
"陌37656"
,
"电视45686机"
));
drawMessageList
.add(
new
DrawMessage(
"陌15638+"
,
"电576视机"
));
for
(
int
i =
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
=
new
Runnable() {
@Override
public void
run() {
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
);
}
}
};
}