zoukankan      html  css  js  c++  java
  • 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");//阴影

  • 相关阅读:
    第七讲 宋词:婉约之曲与豪放之声
    P2024 食物链
    可以吹一年的事
    信息传递
    11.11模拟赛总结(又名斗地主战记)
    11.9模拟赛总结
    扩展欧几里得(exgcd模板)
    发糖果(拓扑排序模板)
    高斯消元
    关于我
  • 原文地址:https://www.cnblogs.com/langfei8818/p/6555474.html
Copyright © 2011-2022 走看看