Android学习笔记---自定义TextView实现阴影效果

直接上代码

SGTextView.java
 1 package com.example.tv.view;
 2 
 3 import android.content.Context;
 4 import android.graphics.Canvas;
 5 import android.graphics.Color;
 6 import android.graphics.LinearGradient;
 7 import android.graphics.Paint;
 8 import android.graphics.Shader;
 9 import android.graphics.Shader.TileMode;
10 import android.util.AttributeSet;
11 import android.widget.TextView;
12 
13 public class SGTextView extends TextView {
14     private Paint strokPaint = new Paint();
15     private Paint gradientPaint = new Paint();
16 
17     public SGTextView(Context context) {
18         this(context, null);
19     }
20 
21     public SGTextView(Context context, AttributeSet attrs) {
22         super(context, attrs);
23     }
24 
25     public void setStyle(String strokeColor, String startColor,
26             String endColor, float strokewidthDp, int gradientHeighDp) {
27         setStyle(
28                 Color.parseColor(strokeColor),
29                 DimensUtils.dip2px(getContext(), strokewidthDp),
30                 new LinearGradient(0, 0, 0, DimensUtils.dip2px(getContext(),
31                         gradientHeighDp), new int[] {
32                         Color.parseColor(startColor),
33                         Color.parseColor(endColor) }, null, TileMode.CLAMP));
34     }
35 
36     public void setStyle(int strokeColor, float strokewidth, Shader shader) {
37 
38         strokPaint.setAntiAlias(true);
39         // 设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
40         strokPaint.setDither(true);
41         // 如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快显示
42         // 速度,本设置项依赖于dither和xfermode的设置
43         strokPaint.setFilterBitmap(true);
44 
45         strokPaint.setStrokeWidth(strokewidth);
46         strokPaint.setColor(strokeColor);
47         // 设置绘制时各图形的结合方式,如平滑效果等
48         strokPaint.setStrokeJoin(Paint.Join.ROUND);
49         // 当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式,如圆形样式
50         // Cap.ROUND,或方形样式Cap.SQUARE
51         strokPaint.setStrokeCap(Paint.Cap.ROUND);
52         strokPaint.setStyle(Paint.Style.STROKE);
53 
54         gradientPaint.setAntiAlias(true);
55         gradientPaint.setDither(true);
56         gradientPaint.setFilterBitmap(true);
57         gradientPaint.setShader(shader);
58         gradientPaint.setStrokeJoin(Paint.Join.ROUND);
59         gradientPaint.setStrokeCap(Paint.Cap.ROUND);
60         gradientPaint.setStyle(Paint.Style.FILL_AND_STROKE);
61 
62         float textsize = getTextSize();
63         strokPaint.setTextSize(textsize);
64         gradientPaint.setTextSize(textsize);
65 
66     }
67 
68     public void setShadowLayer(float radius, float dx, float dy, String color) {
69         strokPaint.setShadowLayer(radius, dx, dy, Color.parseColor(color));
70     }
71 
72     @Override
73     protected void onDraw(Canvas canvas) {
74 
75         String text = getText().toString();
76         int width = getMeasuredWidth();
77         if (width == 0) {
78             measure(0, 0);
79             width = (int) (getMeasuredWidth() + strokPaint.getStrokeWidth() * 2);
80             setWidth(width);
81         }
82 
83         float y = getBaseline();
84         float x = (width - strokPaint.measureText(text)) / 2;
85 
86         canvas.drawText(text, x, y, strokPaint);
87         canvas.drawText(text, x, y, gradientPaint);
88     }
89 }
DimensUtils.java
 1 package com.example.tv.view;
 2 
 3 import android.content.Context;
 4 
 5 public final class DimensUtils {
 6     private DimensUtils() {
 7     }
 8 
 9     public static int px2dip(Context context, float pxValue) {
10         final float scale = context.getResources().getDisplayMetrics().density;
11         return (int) (pxValue / scale + 0.5f);
12     }
13 
14     public static int dip2px(Context context, float dipValue) {
15         final float scale = context.getResources().getDisplayMetrics().density;
16         return (int) (dipValue * scale + 0.5f);
17     }
18 
19     public static int px2sp(Context context, float pxValue) {
20         final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
21         return (int) (pxValue / fontScale + 0.5f);
22     }
23 
24     public static int sp2px(Context context, float spValue) {
25         final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
26         return (int) (spValue * fontScale + 0.5f);
27     }
28 
29 }

 

下面在布局中使用它

1         <com.example.tv.view.SGTextView
2             android:id="@+id/tv_tishis"
3             android:layout_width="wrap_content"
4             android:text="换台中"
5             android:layout_height="match_parent"
6             android:textSize="15sp"
7             android:gravity="center"
8             android:visibility="gone"
9             android:layout_centerHorizontal="true" />

 

在代码中设置颜色以及阴影

1         tvMainPeogressBar = (SGTextView) findViewById(R.id.tv_tishis);
2         tvMainPeogressBar.setTextSize(43);//字体大小
3         tvMainPeogressBar.setText("换台中……");//文本内容
4         tvMainPeogressBar.setStyle("#ded8cd", "#7d7a74", "#a1969d", 3, 9);//渐变颜色
5         tvMainPeogressBar.setShadowLayer(2, 0, 2, "#000000");//阴影

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Android自定义TextView中显示全部内容,可以使用以下两种方法: 1. 使用setEllipsize()方法 通过设置setEllipsize()方法,可以在TextView的末尾添加省略号,从而指示文本被截断。你可以使用以下代码来实现: ``` yourTextView.setEllipsize(TextUtils.TruncateAt.END); yourTextView.setSingleLine(true); ``` 上述代码将设置TextView只显示一行并在末尾添加省略号。 2. 自定义TextView 你可以从TextView类继承一个新类,并覆盖onMeasure()方法以测量控件的高度和宽度。 你可以使用以下代码实现: ``` public class CustomTextView extends TextView { public CustomTextView(Context context) { super(context); } public CustomTextView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //获取TextView的内容 CharSequence text = getText(); if (text != null) { //测量TextView的高度 int width = getMeasuredWidth(); int height = getMeasuredHeight(); int lineCount = getLineCount(); int lineHeight = getLineHeight(); int totalHeight = lineCount * lineHeight; if (totalHeight > height) { setMeasuredDimension(width, totalHeight); } } } } ``` 上述代码将测量TextView的高度,如果文本的高度超出了TextView的高度,则调整TextView的高度以适应文本。然后你可以使用此自定义TextView来显示你的文本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值