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");//阴影

时间: 2024-10-11 15:07:05

Android学习笔记---自定义TextView实现阴影效果的相关文章

Android学习笔记-EditText&TextView&Button&菜单栏

界面文件activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:layout_width="match_parent"     android:layout_height="ma

Android开发学习笔记-自定义TextView属性模版

如果项目中有很多个控件使用的是同一种样式,则为了方便,可以将样式设置到系统中去,这样使用的时候会方便很多. 下面是自定义样式模版的方法. 1.在style.xml文件中添加自己要设置的样式内容 <resources> <!-- Base application theme, dependent on API level. This theme is replaced by AppBaseTheme from res/values-vXX/styles.xml on newer devic

Android学习笔记-EditText&amp;TextView&amp;Button&amp;菜单栏

界面文件activity_main.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/too

【转】 Pro Android学习笔记(二二):用户界面和控制(10):自定义Adapter

目录(?)[-] 设计Adapter的布局 代码部分 Activity的代码 MyAdapter的代码数据源和构造函数 MyAdapter的代码实现自定义的adapter MyAdapter的代码继续探讨BaseAdapter 我们可以同继承抽象类BaseAdapter来实现自己的Adapter,自己设置子View的UI,不同子View可以由不同的布局,并自己进行数据和子view中数据的对应关系.图是例子的呈现结果,我们有很多图标,对这些图标按一定大小进行缩放,然后布局在GridView中.这个

Android学习笔记18:自定义Seekbar拖动条式样

Android学习笔记18:自定义Seekbar拖动条式样

Android学习笔记二十九之SwipeRefreshLayout、RecyclerView和CardView

Android学习笔记二十九之SwipeRefreshLayout.RecyclerView和CardView 前面我们介绍了AlertDialog和几个常用的Dialog,ProgressDialog进度条提示框.DatePickerDialog日期选择对话框和TimePickerDialog时间选择对话框.这一节我们介绍几个新的API控件SwipeRefreshLayout.RecyclerView和CardView,这几个API控件都是google在Android5.0推出的.下面我们来学

Android学习笔记(四二):SQLite、ListView、ContextMenu

继续上一个例子,结合ListView中对SQLite进行操作. 通过CursorAdapter在ListView中的数据呈现 在上一个例子中,我们可以对SQLite中的数据库进行增删改查,将数据读到游标Cursor中,然后一一读出.在Android中可以通过CursorAdapter直接将数据映射到ListView中,如下处理: public class Chapter22Test1 extends ListActivity{    private SQLiteDatabase  db = nu

Android学习笔记(十九):建立自己的ListView

在之前的例子中,我们通过设置adapter的getView()来编写我们所希望的UI,然而在面向对编程中,我们希望能够创建自己的ListView,例如类的名字为com.wei.android.learning.RatingView,只要在XML中用我们自己的RatingView对ListView来替代,就可以实现我们的风格,并前在源代码中向使用ListView一样简单调用就可以了. 实现的目标 在Android XML文件中,可以如下调用我们的RatingView: <com.wei.andro

Android学习笔记二

17. 在ContentProvider中定义的getType()方法是定义URI的内容类型. 18. SQLiteDatabase类中的insert/delete/update/query方法其实也挺好用的,我在EquipmentProvider类中做了实现 19. Android专门有个单元测试项目(Android Test Project),在这个项目中,可以新建一个继承AndroidTestCase类的具体测试类来单元测试某个功能.我新建了一个AndroidTestProject项目,在