版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】教你如何实现AndroidTextView文字轮播效果
效果图:实现思路:1.ViewAnimator思路使用ViewAnimator自身特性,对期中的子view实现动画切换2.自定义viewGroup思路在这个思路下,我们自定义一个容器,继承FrameLayout,根据数据数量自己new相应数量的itemView出来加入FrameLayout,动画是通过对当前itemView做一个出去的佛纳甘话,同时对下一个itemView做一个进入动画,使用handle实现延迟轮换3.ViewFlipper思路ViewFlipper思路和ViewAnimator一样,不过ViewFlipper使用上更灵活,这里我们根据数据流量动态往ViewFlipper里添加itemView4.自定义textView思路其实这个思路也好理解,我们继承textView,然后在onDraw绘制中自己话文字,自己做动画,动画的思路是先把上一个文字上移到顶,然后再绘制下一个文字,从下面开始一直移动到中间ViewAnimator思路ViewAnimator是个viewGroup,可以实现动画切换其中子view的效果。在xml布局种,我们把ViewAnimator当一个容器,里面写轮播的view,写多少个view就有多少个轮播,然后设置切换的动画,用handle做定时延迟轮播,调ViewAnimator.onNext就可以切换到下一个view1.先在layoutxml中声明布局层级结构:<ViewAnimator
android:layout_width="match_parent"
android:layout_height="200dp">
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="欢迎"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="测试"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="本程序"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="!!!!!"/>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="hello,world"/>
</ViewAnimator>2.代码种设置切换动画viewAnimator.setOutAnimation(this,R.anim.slide_out_up);
viewAnimator.setInAnimation(this,R.anim.slide_in_down);3.handle延迟循环显示下一个publicvoidshowNext(){
viewAnimator.showNext();
}
publicvoidshowPrevious(){
viewAnimator.showPrevious();
}
Handlerhandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);
if(autoPlayFlag){
showNext();
}
handler.sendMessageDelayed(newMessage(),TIME_INTERVAL);
}
};我们在需要的位置发送handle事件就可以了使用ViewAnimator有点和确定同样明显自定义viewGroup思路在这个思路下,我们自定义一个容器,继承FrameLayout,根据数据数量自己new相应数量的itemView出来加入FrameLayout,动画是通过对当前itemView做一个出去的佛纳甘话,同时对下一个itemView做一个进入动画,使用handle实现延迟轮换1.在设置数据时添加相应数量的itemView进去publicvoidsetNoticeList(List<String>list){
//创建TextView
for(inti=0;i<list.size();i++){
TextViewtextView=createTextView(list.get(i));
mNoticeList.add(textView);
addView(textView);
}
//显示第一条公告
mCurrentNotice=0;
mNoticeList.get(mCurrentNotice).setVisibility(VISIBLE);
//启动轮播
start();
}
privateTextViewcreateTextView(Stringtext){
if(mLayoutParams==null){
mLayoutParams=newLayoutParams(
LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);
mLayoutParams.gravity=Gravity.CENTER_VERTICAL;
}
TextViewtextView=newTextView(getContext());
textView.setLayoutParams(mLayoutParams);
textView.setSingleLine();
textView.setEllipsize(TextUtils.TruncateAt.END);
textView.setTextColor(mTextColor);
textView.setVisibility(GONE);
textView.setText(text);
//如果有设置字体大小,如果字体大小为null。
if(mTextSize>0){
textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,mTextSize);
}
returntextView;
}2.在handle里面启动itemView切换的动画classNoticeRunnableimplementsRunnable{
@Override
publicvoidrun(){
//隐藏当前的textView
TextViewcurrentView=mNoticeList.get(mCurrentNotice);
currentView.setVisibility(GONE);
if(mExitAnimSet!=null){
currentView.startAnimation(mExitAnimSet);
}
mCurrentNotice++;
if(mCurrentNotice>=mNoticeList.size()){
mCurrentNotice=0;
}
//显示下一个TextView
TextViewnextView=mNoticeList.get(mCurrentNotice);
nextView.setVisibility(VISIBLE);
if(mEnterAnimSet!=null){
nextView.startAnimation(mEnterAnimSet);
}
mHandler.postDelayed(this,mNoticeDuration);
}
}
privatevoidcreateEnterAnimation(){
mEnterAnimSet=newAnimationSet(false);
TranslateAnimationtranslateAnimation=
newTranslateAnimation(0,0,0,0,TranslateAnimation.RELATIVE_TO_PARENT,1f,
TranslateAnimation.RELATIVE_TO_SELF,0f);
AlphaAnimationalphaAnimation=newAlphaAnimation(0f,1f);
mEnterAnimSet.addAnimation(translateAnimation);
mEnterAnimSet.addAnimation(alphaAnimation);
mEnterAnimSet.setDuration(DEFAULT_ANIMATION_DURATION);
}
privatevoidcreateExitAnimation(){
mExitAnimSet=newAnimationSet(false);
TranslateAnimationtranslateAnimation=
newTranslateAnimation(0,0,0,0,TranslateAnimation.RELATIVE_TO_SELF,0f,
TranslateAnimation.RELATIVE_TO_PARENT,-1f);
AlphaAnimationalphaAnimation=newAlphaAnimation(1f,0f);
mExitAnimSet.addAnimation(translateAnimation);
mExitAnimSet.addAnimation(alphaAnimation);
mExitAnimSet.setDuration(DEFAULT_ANIMATION_DURATION);
}这样写最练手,但是我是不推荐这样干的,基础差一些的容易出问题,而且google给我们提供了一些实现,我们何必非的自己实现呢,这样写会花点时间ViewFlipper思路ViewFlipper思路像是上面1和2的结合,ViewFlipper对动画的控制更优秀一些,我们往ViewFlipper里面动态添加itemView,基本都是这个思路,区别是使用的容器不同这里推荐一个成熟的库:这个库非常完善了,也能满足大家的常用需求,是可以拿来直接用的,大家看图就明白了他这里自定义了一个ViewGroup继承自RelativeLayout,在view初始化时添加了一个ViewFlipper进来,之后操作的都是这个ViewFlipper了1.自定义ViewGroup初始化时添加了ViewFlipper/**初始化控件*/
privatevoidinit(Contextcontext,AttributeSetattrs,intdefStyleAttr){
mViewFlipper=newViewFlipper(getContext());//new一个ViewAnimator
mViewFlipper.setLayoutParams(newLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
addView(mViewFlipper);
startViewAnimator();
//设置点击事件
mViewFlipper.setOnClickListener(newOnClickListener(){
@Override
publicvoidonClick(Viewv){
intposition=mViewFlipper.getDisplayedChild();//当前显示的子视图的索引位置
if(mListener!=null){
mListener.onItemClick(mDatas.get(position),position);
}
}
});2.根据数据添加itemView/**设置数据集合*/
publicvoidsetDatas(List<String>datas){
this.mDatas=datas;
if(DisplayUtils.notEmpty(mDatas)){
mViewFlipper.removeAllViews();
for(inti=0;i<mDatas.size();i++){
TextViewtextView=newTextView(getContext());
textView.setText(mDatas.get(i));
//任意设置你的文字样式,在这里
textView.setSingleLine(isSingleLine);
textView.setTextColor(mTextColor);
textView.setTextSize(mTextSize);
textView.setGravity(mGravity);
mViewFlipper.addView(textView,i);//添加子view,并标识子view位置
}
}
}3.添加动画/**
*设置进入动画和离开动画
*
*@paraminAnimResId进入动画的resID
*@paramoutAnimResID离开动画的resID
*/
privatevoidsetInAndOutAnimation(@AnimResintinAnimResId,@AnimResintoutAnimResID){
AnimationinAnim=AnimationUtils.loadAnimation(getContext(),inAnimResId);
inAnim.setDuration(animDuration);
mViewFlipper.setInAnimation(inAnim);
AnimationoutAnim=AnimationUtils.loadAnimation(getContext(),outAnimResID);
outAnim.setDuration(animDuration);
mViewFlipper.setOutAnimation(outAnim);
}之后就是用handle来做延迟循环,上面复制好几遍了,这里是在不想再复制了,打个源码很简单,大家直接看。吐槽下:这个库多了一道手,多加了一个视图层级出来,其实没必要在顶层加一个viewGroup了,直接继承ViewFlipper可好自定义textView思路不继承textView我们直接继承view都可以,只要不支持wrap_content就好办。核心就是在onDraw中实现绘制的动画。例子这里没有使用ValueAnimator动画,而是1个px变化就重绘一次,性能上欠考虑。1.根据文字,确定文字出屏幕的零界点//获取文字矩阵的尺寸
RectindexBound=newRect();
mPaint.getTextBounds(text,0,text.length(),indexBound);
//文字居中绘制Y的坐标
my=mHeight/2
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 重庆市石英玻璃矿租赁合同样本
- 公司之间双方合作协议书9篇
- 位置租赁合同
- 2024春五年级下语文期中归类整合复习-字词、句子品析、课文积累
- 《纯电动汽车构造与检修》祝良荣 第二版 教案 1.1 电动汽车概念和分类的认知 - 4.3 DCDC变换器的认知与拆卸
- 建设高速公路畅通交通
- 《机械产品三维工艺设计+第7部分:发放要求GBT+41923.7-2022》详细解读
- 二年级下册美术教案及反思 - 第九课 动漫亮相 ︳湘美版
- 粤教版八年级地理上册教案(全册)
- 国际合作高中地理人教版(2019)选择性必修2
- 素食行业发展趋势
- 初中九年级化学课件物质的鉴别和除杂
- 2024年计算机视觉技术的突破
- 矿山地质环境调查评估与治理方法探讨课件
- 小程序发布协议
- 幼儿园课程游戏化与区域活动的有机结合
- 药物过敏患者的护理查房
- 垃圾处理安全生产
- 班队一年级《珍爱生命-健康成长》
- 高一物理必修二期中测试(含答案)
- 读书分享读书交流会《狂人日记》课件
评论
0/150
提交评论