zo 滚动TextView显示广告是一种常用的功能,其实现方法也是多种多样,今天给大家分享一下滚动类族的父类ViewAnimator,
首先看看继承关系图
ViewAnimator继承自FrameLayout,相比之下只是多了控制其子view进出场 以及播放动画
关键属性:
android:inAnimation="@anim/in_anim"
android:outAnimation="@anim/out_anim"
分别制定进场 出场的动画
关键方法:
animator.showNext();//显示下一个ivew
animator.showPrevious();//显示上一个view
animator.setDisplayedChild(1);//显示指定的子view 参数是索引
animator.setAnimateFirstView(true);//首次加载是否显示动画
animator.setInAnimation(context,R.anim.in_anim);//代码设置进场动画
animator.setOutAnimation(context,R.anim.in_anim);
这个类的核心方法
void showOnly(int childIndex, boolean animate) {
final int count = getChildCount();
for (int i = 0; i < count; i++) {
final View child = getChildAt(i);
if (i == childIndex) {
if (animate && mInAnimation != null) {
child.startAnimation(mInAnimation);
}
child.setVisibility(View.VISIBLE);
mFirstTime = false;
} else {
if (animate && mOutAnimation != null && child.getVisibility() == View.VISIBLE) {
child.startAnimation(mOutAnimation);
} else if (child.getAnimation() == mInAnimation)
child.clearAnimation();
child.setVisibility(View.GONE);
}
}
}
这个方法就是用来播放进出场动画的最终实现方法了 也很简单, 把播放动画播放完毕,当前需要显示的子view设置为VISIBLE 其他的GONE
接下来可以借助这个类封装一个广告控件方便使用
效果图 右边的textView定时滚动左边是一个图片(拿来用用)
控件代码
/**
* Created by QiuQ on 2017-07-14.
*/
public class ScrollViewLayout extends LinearLayout {
private ImageView mHeadImg;
private ViewAnimator mViewAnimator;
private Context mContext;
private float mTextSize;
private int mTextColor;
private long mScrollTime;
private boolean isScroll = true;
private int mInAnim;
private int mOutAnim;
private int mDefaultIdValue = -1;
private AnimationSet mDefaultInAnim;
private AnimationSet mDefaultOutAnim;
private Handler mHandler;
public ScrollViewLayout(Context context) {
super(context);
init(context, null, 0);
}
public ScrollViewLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init(context, attrs, 0);
}
public ScrollViewLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context, attrs, defStyleAttr);
}
private void init(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
mContext = getContext();
mHandler = new Handler();
mHeadImg = new ImageView(mContext);
mViewAnimator = new ViewAnimator(context);
//默认的进场动画
Animation inTrans = new TranslateAnimation(0, 0, 50, 0);
Animation inAlpha = new AlphaAnimation(0, 1);
mDefaultInAnim = new AnimationSet(true);
mDefaultInAnim.addAnimation(inTrans);
mDefaultInAnim.addAnimation(inAlpha);
mDefaultInAnim.setDuration(500);
//默认的出场动画
Animation outTrans = new TranslateAnimation(0, 0, 0, -50);
Animation outAlpha = new AlphaAnimation(1, 0);
mDefaultOutAnim = new AnimationSet(true);
mDefaultOutAnim.addAnimation(outTrans);
mDefaultOutAnim.addAnimation(outAlpha);
mDefaultOutAnim.setDuration(500);
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.setMargins(30, 30, 20, 30);
mHeadImg.setLayoutParams(params);
setOrientation(HORIZONTAL);
setGravity(Gravity.CENTER_VERTICAL);
LayoutParams layoutParams = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
mViewAnimator.setLayoutParams(layoutParams);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.scrollViewLayout);
int resource = a.getResourceId(R.styleable.scrollViewLayout_mHeadImgSrc, mDefaultIdValue);
mTextSize = a.getDimension(R.styleable.scrollViewLayout_mTextSize, 15);
mTextColor = a.getColor(R.styleable.scrollViewLayout_mTextColor, Color.BLACK);
mScrollTime = a.getInteger(R.styleable.scrollViewLayout_mScrollTime, 2000);
mInAnim = a.getResourceId(R.styleable.scrollViewLayout_mInAnim, mDefaultIdValue);
mOutAnim = a.getResourceId(R.styleable.scrollViewLayout_mOutAnim, mDefaultIdValue);
if (resource != mDefaultIdValue) {
mHeadImg.setImageResource(resource);
}
if (mInAnim != mDefaultIdValue) {
mViewAnimator.setInAnimation(mContext, mInAnim);
} else {
mViewAnimator.setInAnimation(mDefaultInAnim);
}
if (mOutAnim != mDefaultIdValue) {
mViewAnimator.setOutAnimation(mContext, mOutAnim);
} else {
mViewAnimator.setOutAnimation(mDefaultOutAnim);
}
a.recycle();
addView(mHeadImg);
addView(mViewAnimator);
}
public ImageView getHeadImg() {
return mHeadImg;
}
public ViewAnimator getViewAnimator() {
return mViewAnimator;
}
public void showNext() {
mViewAnimator.showNext();
}
public void showPrevious() {
mViewAnimator.showPrevious();
}
public void addData(List<String> data) {
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.MATCH_PARENT);
params.setMargins(0, 30, 0, 20);
float scaleDensity = mContext.getResources().getDisplayMetrics().scaledDensity;
if (data != null && data.size() > 0) {
for (int i = 0; i < data.size(); i++) {
TextView textView = new TextView(mContext);
///设置样式
textView.setLines(1);
textView.setGravity(Gravity.CENTER_VERTICAL);
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setTextColor(mTextColor);
textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, mTextSize / scaleDensity);
textView.setLayoutParams(params);
textView.setId(i);
textView.setPadding(0, 8, 0, 0);
textView.setText(data.get(i));
mViewAnimator.addView(textView);
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (clickListener != null) {
clickListener.onClick(v);
}
}
});
}
//定时切换
mHandler.postDelayed(runnable, mScrollTime);
}
}
Runnable runnable = new Runnable() {
@Override
public void run() {
if (isScroll) {
mViewAnimator.showNext();
mHandler.postDelayed(this, mScrollTime);
}
}
};
@Override
protected void onDetachedFromWindow() {
super.onDetachedFromWindow();
isScroll = false;
mHandler.removeCallbacks(runnable);
}
//回调TextView的点击事件
private onTextClickListener clickListener;
public void setOnTextViewClick(onTextClickListener clickListener) {
this.clickListener = clickListener;
}
public interface onTextClickListener {
void onClick(View v);
}
}
activity使用
private List<String> data = new ArrayList<>();
data.add("凄凄复凄凄,嫁娶不须啼凄凄复凄凄,嫁娶不须啼凄凄复凄凄,嫁娶不须啼");
data.add("愿得一人心,白首不相离");
data.add("竹竿何袅袅,鱼尾何簁簁");
data.add("男儿重意气,何用钱刀为");
myViewAnimator.addData(data);//添加数据
myViewAnimator.setOnTextViewClick(new ScrollViewLayout.onTextClickListener() {
//回调点击事件
@Override
public void onClick(View v) {
if(v instanceof TextView){
TextView t= (TextView) v;
Toast.makeText(context, ""+t.getText().toString(), Toast.LENGTH_SHORT).show();
}
}
});
xml引用// xmlns:qiu=”http://schemas.android.com/apk/res-auto”命名空间(一般写app就行)
自定义的属性
<declare-styleable name="scrollViewLayout">
<attr name="mHeadImgSrc" format="integer" />
<attr name="mTextColor" format="color"/>
<attr name="mTextSize" format="dimension" />
<attr name="mScrollTime" format="integer"/>
<attr name="mInAnim" format="integer"/>
<attr name="mOutAnim" format="integer"/>
</declare-styleable>
由于水平所限 写的很粗糙 旨在介绍 大家一起学习学习