首先跟大家说声抱歉,由于最近鄙人感冒身体欠安,所以博客很久没更新了,我觉得是时候不玩捉迷臧了,废话不多说,还是老套路,上效果图!

其实实现原理很简单首先我们看一张图,画的少不喜随便喷哈哈!

其实说白了就是继承ViewGroup然后重新计算屏幕的宽高
然后在Activity中使用MyTextView.setText(String text,final Animation animation,int duration),参数的含义分别是文本内容,动画类型以及id,然后多久播放一次TextView。
代码如下

`tv=(MyTextView) findViewById(R.id.cTextView);/** 找到控件**/tv.setText("HelloWorld",AnimationUtils.loadAnimation(TvActivity.this,R.anim.myanim),1000);/**然后将MyTextView中的内容按照动画的顺序1秒一次显示在Texview中**/tv.setText("My ScrollingView",AnimationUtils.loadAnimation(TvActivity.this, R.anim.anim_right_into), 1000);`

然后在MyTextView中重写setText方法代码如下

public void setText(String text,final Animation animation,int duration){int time=0;if(text!=null&&!text.isEmpty()){char[] characters=text.toCharArray();for (char c : characters) {final TextView tv=new TextView(cxt);/**遍历每个字符串的每个字符,生成一个TextView并设置他动画**/tv.setText(String.valueOf(c));/**设置字体大小**/tv.setTextSize(30);/**设置字体颜色**/tv.setTextColor(Color.RED);/**创建一个Handler实例**/Handler handler=new Handler();//每隔多少秒播放下一个TextView的动画handler.postDelayed(new Runnable() {@Overridepublic void run() {/**将tv添加到view中然后设置动画**/addView(tv);tv.setAnimation(animation);}}, time);/**设置时间间隔**/time+=duration;}}}

再覆写onLayout方法首先遍历所有的子视图,然后再获取onMeassure尺寸,然后让他们从左往右排列,代码如下:
`

@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {// TODO Auto-generated method stubint childLeft=0;//遍历所有子视图int childCount=getChildCount();for (int i = 0; i < childCount; i++) {View childView=getChildAt(i);//获取在onMeassure计算的尺寸int measureW=childView.getMeasuredWidth();int  measureH=childView.getMeasuredHeight();//将他们横向排列childView.layout(childLeft, 0, childLeft+measureW, measureH);childLeft+=measureW;}}`

然后重新计算measureH和measureW代码如下

private int measureW(int widthMeasureSpec) {int result=0;int widthMode=MeasureSpec.getMode(widthMeasureSpec);//获取模式int widthSize=MeasureSpec.getSize(widthMeasureSpec);//获取尺寸switch (widthMode) {/** * mode共有三种情况,取值分别为MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, * MeasureSpec.AT_MOST。 * * * MeasureSpec.EXACTLY是精确尺寸, * 当我们将控件的layout_width或layout_height指定为具体数值时如andorid * :layout_width="50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。 * * * MeasureSpec.AT_MOST是最大尺寸, * 当控件的layout_width或layout_height指定为WRAP_CONTENT时 * ,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可 * 。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。 * * * MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView, * 通过measure方法传入的模式。 */  case MeasureSpec.AT_MOST:break;
case MeasureSpec.EXACTLY:result=widthSize;break;default:break;}return result;}}
private int measureH(int heightMeasureSpec) {// TODO Auto-generated method stubint result=0;int heightMode=MeasureSpec.getMode(heightMeasureSpec);//获取模式int heightSize=MeasureSpec.getSize(heightMeasureSpec);//获取大小switch (heightMode) {case MeasureSpec.AT_MOST:break;case MeasureSpec.EXACTLY:result=heightSize;break;default:break;}return result;}

最后重写onMeasure方法,代码如下

@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int measureW=measureW(widthMeasureSpec);int measureH=measureH(heightMeasureSpec);measureChildren(widthMeasureSpec, heightMeasureSpec);setMeasuredDimension(measureW, measureH);}

然后在res下面新建一个anim文件夹然后创建myanim.xml和anim_right_into.xml代码如下

myanim.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">  <!--设置时间一秒 从 隐藏到出现--><alpha  android:duration="1000"  android:fromAlpha="0.0"  android:toAlpha="1.0" />
</set>   

anim_right_into.xml代码如下

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">  <translate  android:duration="1000"  android:fillAfter="true"  android:fromXDelta="50%p"  android:interpolator="@android:anim/anticipate_interpolator"  android:toXDelta="0" />
</set>  

然后主布局文件我在这里也贴一下吧

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  xmlns:tools="http://schemas.android.com/tools"  android:layout_width="match_parent"  android:layout_height="match_parent"  android:orientation="vertical"  android:padding="10dp">  <com.zm.mvptest.view.MyTextView android:id="@+id/cTextView"  android:layout_width="match_parent"  android:layout_height="match_parent">
</com.zm.mvptest.view.MyTextView></LinearLayout>  

最后在TvActivity调用MyTextView中的setText方法,完成功能!代码如下

@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.activity_tv);initView();}private void initView() {// 初始化操作tv=(MyTextView) findViewById(R.id.cTextView);// tv.setText("HelloWorld",AnimationUtils.loadAnimation(TvActivity.this,R.anim.myanim),1000);     tv.setText("My ScrollingView",AnimationUtils.loadAnimation(TvActivity.this, R.anim.anim_right_into), 2000);}

其实效果特别简单,这只是一个入门的Demo,在实际开发中您们要根据自己的需求去自定义TextView然后继承ViewGroup等,都是可以实现效果的,有问题可以加群讨论,扫码直接进入!欢迎大家加入!

Android实现从左往右TextView淡入淡出渐变效果相关推荐

  1. Android开发笔记(十五)淡入淡出动画TransitionDrawable

    说到淡入淡出动画,可能大家会想到补间动画里面的AlphaAnimation,不过这个深浅动画只能对透明度做渐变效果,也就是只能对一个图形做深浅的颜色变换.如果我们想要从A图片逐渐变为B图片,也就是要实 ...

  2. Android 手势识别向左,右,上,下,滑动的方向

    识别手势滑动的方向主要是用的     GestureDetector的onFling ,如果想回顾下GestureDetector 可以参考下面的链接地址 GestureDetector 文章 问题也 ...

  3. android activity 淡入 动画,android – 如何在Activity转换上执行淡入淡出...

    您可以创建自己的.xml动画文件以淡入新活动并淡出当前活动: fade_in.xml android:interpolator="@android:anim/accelerate_inter ...

  4. Android直播软件搭建左滑右滑清屏控件

    Android直播软件搭建左滑右滑清屏控件 最近在迭代直播软件搭建功能时,项目中之前的左滑清屏是用ViewPager实现的.这次迭代遇到一个布局层次导致的点击失效问题,继续用ViewPager的话改动 ...

  5. android 左滑右滑,Android仿滴答清单左滑右滑效果

    直接上效果图 记录仿写滴答清单App 过程中的技术点 本文分为以下章节,读者可按需阅读: 1.自定义RecycleItemTouchHelper 2.实现滴答清单左滑右滑效果 3.RecycleVie ...

  6. android 地图路径规矩绘制,地图如何绘制?看地图的规则为什么是上北下南左西右东?...

    地图是按一定的比例运用符号.颜色.文字注记等描绘显示地球表面的自然地理.行政区域.社会经济状况的图形.现代地图通过电脑等技术很容易绘制,那么古代地图是如何绘制的呢?在我国看地图的规则为什么总是上北下南 ...

  7. Android 应用开发(40)---TextView(文本框)详解

    TextView(文本框)详解 1.基础属性详解: 通过下面这个简单的界面,我们来了解几个最基本的属性: 布局代码: <RelativeLayout xmlns:android="ht ...

  8. 探探左滑右滑简单实现

                                                                    简单实现探探左滑右滑 效果演示 首先上网下载一个library文件夹 接 ...

  9. Android - 最基础的控件TextView

    TextView TextView是一个十分简单和基础的控件,相信大家使用TextView主要就是用来显示文字的, 而创建一个项目的时候,页面显示的就一个内容为Hello World 的 TextVi ...

最新文章

  1. 200 个工具分析机器学习十年:开源是大势,工程师是核心
  2. auto_ptr动态分配对象
  3. 设计模式——开发常用的设计模式梳理
  4. python hsv inrange 范围_仅20行代码,用python给证件照换底色
  5. 基于 MinIO 对象存储框架的短视频点播平台设计
  6. python零基础自学教材-python萌新:从零基础入门到放弃
  7. JVM内存结构和Java内存模型别再傻傻分不清了
  8. win10运行命令大全
  9. 示波器触发功能中的释抑
  10. 大数据分析之纳税人画像-实现和优化思路
  11. Python:对已有内容的TXT文件追加读写
  12. 计算机登录网站慢手机快,手机WiFi网速慢,简单输入几个数字立马变快!
  13. 5 个最好的免费开源反病毒工具(PC版)
  14. 配置linux的jdk报错error while loading shared libraries: libjli.so
  15. java 引用数据类型Scanner类 Random类
  16. Android 4.1 Netd详细分析(二)源文件/模块/基础类统领
  17. 芝加哥面孔数据库(CFD)的人脸模板
  18. ptp精准时间协议_网络时钟同步协议– NTP, PTP – 默默的点滴
  19. Ruby之旅之字符串
  20. 2038年问题 linux内核5.6,Linux 5.1延续为2038年问题所做的多年准备

热门文章

  1. linux 如何加载本地镜像至docker
  2. (简单)华为荣耀9i LLD-AL20的Usb调试模式在哪里开启的方法
  3. 言语理解——逻辑填空
  4. Oracle EBS:PO入库(收货)价格不随Blanket更改
  5. UserWarning: This overload of nonzero is deprecated: nonzero(Tensor input, Tensor out) 解决
  6. SQL之strftime()函数
  7. Modelsim仿真时不报错,不出波形“# A time value could not be extracted from the current line”
  8. 用LaTeX给期刊投稿——以AMS模板为例
  9. selenum模块抓取网易云网页搜索结果,并拿到MP3地址
  10. 苹果app充值限制解除_抖音短视频app充值抖币苹果为什么比安卓贵?