热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

TextView文字淡入效果

一个文本渐渐地从左到右的显示。几步就可以了实现了。利用的是View的fade边缘。当然也可以自己画,可是没有成功。Java代码直接上代码:classFadeTextViewextend
一个文本渐渐地从左到右的显示。 
几步就可以了实现了。利用的是View的fade边缘。当然也可以自己画,可是没有成功。 
Java代码  收藏代码
  1. 直接上代码:  
  2. class FadeTextView extends TextView {  
  3.   
  4.     long delta=70l; //步进时间  
  5.     int number" >0;    //字符串宽度  
  6.     int widthPixels=0;  //字符串的显示宽度  
  7.     int wp=4;   //字符串的显示宽度步进  
  8.   
  9.     public FadeTextView(Context context) {  
  10.         super(context);  
  11.         init();  
  12.     }  
  13.   
  14.     public FadeTextView(Context context, AttributeSet attrs) {  
  15.         super(context, attrs);  
  16.         TypedArray a=  
  17.             context.obtainStyledAttributes(  
  18.                 attrs, R.styleable.FadeTextView);  
  19.         delta=(long) a.getInt(R.styleable.FadeTextView_fade_txt_delta, (int) delta);  
  20.         wp=a.getInt(R.styleable.FadeTextView_fade_txt_wp, wp);  
  21.         init();  
  22.     }  
  23.   
  24.     public FadeTextView(Context context, AttributeSet attrs, int defStyle) {  
  25.         super(context, attrs, defStyle);  
  26.         TypedArray a=  
  27.             context.obtainStyledAttributes(  
  28.                 attrs, R.styleable.FadeTextView, defStyle, 0);  
  29.         delta=(long) a.getInt(R.styleable.FadeTextView_fade_txt_delta, (int) delta);  
  30.         wp=a.getInt(R.styleable.FadeTextView_fade_txt_wp, wp);  
  31.         init();  
  32.     }  
  33. //关于delta,wp这两个属性是在attrs.xml中配置的。动画显示的速度由这两个值控制,当然要加入时间的话,也是可以。以时间为第一选择,然后才是每次显示的宽度  
  34.     private void init() {  
  35.         setSingleLine(true);  
  36.         setHorizontalFadingEdgeEnabled(true);  //这两句才能显示出阴影效果。  
  37.         widthPixels=4;  
  38.         keyword" >int) getPaint().measureText(getText().toString());  
  39.         KeelLog.v("init.width:"+width+" getText().toString():"+getText().toString());  
  40.         postDelayed(mRunnable, delta);  
  41.     }  
  42.   
  43.     @Override  
  44.     public void setText(CharSequence text, BufferType type) {  
  45.         super.setText(text, type);  
  46.         init();  
  47.     }  
  48. //这个是最重要的方法,就是对TextView设置宽度,因为当一个TextView宽度不够显示出文本时,边缘会有阴影效果。当然还要设置单行的,否则是不行的。  
  49.     public void setWidthLength(int pixels) {  
  50.         setWidth(pixels);  
  51.     }  
  52.   
  53.     Runnable mRunnable=new Runnable() {  
  54.         @Override  
  55.         public void run() {  
  56.             //KeelLog.d("update:"+widthPixels+" width:"+width);  
  57.             if (width>0&&widthPixels
  58.                 widthPixels+=wp;  
  59.                 setWidthLength(widthPixels);  
  60.                 postInvalidate();  
  61.                 postDelayed(mRunnable, delta);  
  62.             } else {  
  63.                 //removeCallbacks(mRunnable);  
  64.             }  
  65.         }  
  66.     };  
  67.   
  68. }  
  69. attrs.xml  
  70. "FadeTextView">  
  71.         "fade_txt_delta" format="reference|integer"/>  
  72.         "fade_txt_wp" format="reference|integer"/>  
  73.       
  74.   
  75.   
  76. 如果使用xml,则不会产生阴影,而是... ,这可能要设置一些属性。  
  77. 用java代码添加:  
  78. LinearLayout layout;//=new LinearLayout(this);  
  79.         layout=(LinearLayout) findViewById(R.id.layout);  
  80.         layout.setOrientation(LinearLayout.VERTICAL);  
  81.         layout.setBackgroundColor(R.color.holo_green_light);  
  82.         final FadeTextView textView=new FadeTextView(this);  
  83.         //textView.setWidthLength(8);  
  84.         LinearLayout.LayoutParams layoutParams=new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);  
  85.         //layoutParams.gravity=Gravity.CENTER;  
  86.         textView.setTextSize(28);  
  87.         textView.setText("互联网电视");  
  88.         layout.addView(textView, layoutParams);  
  89. 就可以看效果了。  
  90.   
  91. View中的画阴影的代码:这段代码不起作用。就只能用上面的笨办法来淡入显示文本了。  
  92. int saveCount;  
  93.     int length=40;  //fade length  
  94.     float right;  
  95.     float top=0;  
  96.     float bottom;  
  97.     float fadingEdgeLength=25f;  
  98.     float rightFadeStrength=5f;  
  99.     public Paint paint;  
  100.     public Matrix matrix;  
  101.     public Shader shader;  
  102.   
  103.     private void drawTxt(Canvas canvas) {  
  104.         /*setFadingEdgeLength(length); 
  105.         setHorizontalFadingEdgeEnabled(true); 
  106.         setFadeColor(Color.GREEN);*/  
  107.         right=getRight();  
  108.         bottom=getBottom();  
  109.         fadingEdgeLength=getHeight();  
  110.         saveCount=canvas.getSaveCount();  
  111.   
  112.         int solidColor=getSolidColor();  
  113.         if (solidColor==0) {  
  114.             final int flags=Canvas.HAS_ALPHA_LAYER_SAVE_FLAG;  
  115.   
  116.             canvas.saveLayer(right-length, top, right, bottom, null, flags);  
  117.         } else {  
  118.             setFadeColor(solidColor);  
  119.         }  
  120.   
  121.         // Step 5, draw the fade effect and restore layers  
  122.         final Paint p=paint;  
  123.         final Matrix matrix=MyTextView.this.matrix;  
  124.         final Shader fade=shader;  
  125.         final float fadeHeight=fadingEdgeLength;  
  126.   
  127.         matrix.setScale(1, fadeHeight*rightFadeStrength);  
  128.         matrix.postRotate(90);  
  129.         matrix.postTranslate(right, top);  
  130.         fade.setLocalMatrix(matrix);  
  131.         canvas.drawRect(right-length, top, right, bottom, p);  
  132.   
  133.         KeelLog.d(VIEW_LOG_TAG, String.format("top:%f,right:%f,bottom:%f,(right-length):%f,fadingEdgeLength:%f", top, right, bottom, right-length, fadingEdgeLength));  
  134.   
  135.         canvas.restoreToCount(saveCount);  
  136.     }  
  137. private void init() {  
  138.         setText(subText);  
  139.         right=getRight();  
  140.         bottom=getBottom();  
  141.         paint=new Paint();  
  142.         matrix=new Matrix();  
  143.         // use use a height of 1, and then wack the matrix each time we  
  144.         // actually use it.  
  145.         shader=new LinearGradient(00010xFF0000000, Shader.TileMode.CLAMP);  
  146.   
  147.         paint.setShader(shader);  
  148.         paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));  
  149.     }  
  150. 其中两个重点是:canvas.saveLayer(right-length, top, right, bottom, null, flags); 遮罩层。就是阴影部分。  
  151.   
  152. shader=new LinearGradient(00010xFF0000000, Shader.TileMode.CLAMP);  
  153.         paint.setShader(shader);  
  154.         paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));//填充方式,大概是中间空的,边缘较突出的  
  155. 可是上面的代码画不出阴影。失望。  
  156. 如果有同学用这段代码画出来了,希望回复。 

推荐阅读
author-avatar
klolo先生
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有