使用


public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_stroke_textview);
        //在布局中使用
        ((StrokeTextView) findViewById(R.id.tv1)).append("\n支持append,支持图文混排");
        ((StrokeTextView) findViewById(R.id.tv2)).setStrokeColorAndWidth(0xff0000ff, 3f);

        //在代码中使用
        LinearLayout ll_root = (LinearLayout) findViewById(R.id.ll_root);
        //默认
        StrokeTextView strokeTextView3 = new StrokeTextView(this);
        strokeTextView3.setText("支持在代码中创建");
        strokeTextView3.setBackgroundColor(0x3f0000ff);
        strokeTextView3.setGravity(Gravity.CENTER);
        ll_root.addView(strokeTextView3);//默认是(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)
        //设置setPadding、setMargins
        StrokeTextView strokeTextView4 = new StrokeTextView(this);
        strokeTextView4.setText("设置Padding、Margins");
        strokeTextView4.setTextColor(0xff00ff00);
        strokeTextView4.setTextSize(20);
        strokeTextView4.setStrokeColorAndWidth(0xffff0000, 2.5f);
        strokeTextView4.setBackgroundColor(0x30ff00ff);
        strokeTextView4.setPadding(30, 0, 60, 0);
        LinearLayout.LayoutParams mLayoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
        mLayoutParams.setMargins(30, 0, 0, 0);
        strokeTextView4.setLayoutParams(mLayoutParams);
        ll_root.addView(strokeTextView4);
    }
}

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ll_root"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#2000"
    android:orientation="vertical"
    android:padding="5dp" >
    <com.bqt.myview.StrokeTextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:drawableRight="@drawable/ic_launcher"
        android:text="带描边的TextView"
        android:textColor="#fff"
        android:textSize="18sp" />
    <com.bqt.myview.StrokeTextView
        android:id="@+id/tv2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:gravity="right"
        android:paddingRight="10dp"
        android:text="支持设置padding,margin,textSize,宽高、textColor,背景,gravity,及sp,dp,px单位"
        android:textColor="#0f0"
        android:textSize="30px" />
</LinearLayout>

View

/*
 * 给文字加描边,实现方法是两个TextView叠加,只有描边的TextView放在底部,实体TextView叠加在上面
 * 当此控件被创建的同时创建另一个TextView,并将此TextView设为STROKE样式
 * 在测量onMeasure、绘制onDraw、布局onLayout自身时,使用同样的参数同样的方式处理此STROKE样式的TextView
 */
public class StrokeTextView extends TextView {
    /**描边的TextView*/
    private TextView strokeTextView = null;
    /**描边的TextView的颜色*/
    private int strokeColor = 0xffff0000;
    /**描边的TextView的宽度*/
    private float strokeWidth = 1.5f;

    /**
     * 设置描边的颜色和宽度
     */
    public void setStrokeColorAndWidth(int strokeColor, float strokeWidth) {
        this.strokeColor = strokeColor;
        this.strokeWidth = strokeWidth;
        init();//必须重新调用初始化方法
    }

    public StrokeTextView(Context context) {
        this(context, null);
    }
    public StrokeTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public StrokeTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        strokeTextView = new TextView(context, attrs, defStyle);
        init();
    }
    public void init() {
        TextPaint textPaint = strokeTextView.getPaint();
        textPaint.setStrokeWidth(strokeWidth); //设置描边宽度
        strokeTextView.setTextColor(strokeColor); //设置描边颜色
        textPaint.setStyle(Style.STROKE); //对文字只描边
        invalidate();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        strokeTextView.setText(getText());
        strokeTextView.setGravity(getGravity());
        strokeTextView.measure(widthMeasureSpec, heightMeasureSpec);
    }
    @Override
    //卧槽,必须把super放在后面
    protected void onDraw(Canvas canvas) {
        strokeTextView.draw(canvas);
        super.onDraw(canvas);
    }
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        strokeTextView.layout(left, top, right, bottom);
    }

    @Override
    public void setLayoutParams(ViewGroup.LayoutParams params) {
        super.setLayoutParams(params);
        strokeTextView.setLayoutParams(params);
    }
    @Override
    public void setBackgroundResource(int resid) {
        super.setBackgroundResource(resid);
        strokeTextView.setBackgroundResource(resid);
    }
    @Override
    public void setTextSize(float size) {
        super.setTextSize(size);
        strokeTextView.setTextSize(size);
    }
    @Override
    public void setTextSize(int unit, float size) {
        super.setTextSize(unit, size);
        strokeTextView.setTextSize(unit, size);
    }
    @Override
    public void setPadding(int left, int top, int right, int bottom) {
        super.setPadding(left, top, right, bottom);
        strokeTextView.setPadding(left, top, right, bottom);
    }
}

自定义控件 带描边的TextView的更多相关文章

  1. Android自定义控件 -- 带边框的TextView

    使用xml实现边框 原来使用带边框的TextView时一般都是用XML定义来完成,在drawable目录中定义如下所示的xml文件: <?xml version="1.0" ...

  2. 李洪强iOS开发之带placeHolder的Textview

    李洪强iOS开发之带placeHolder的Textview  01 - 创建工过程,定义全局属性,遵守textview的代理协议  02 - 添加一个textview和一个label 03 - 实现 ...

  3. Android 手机卫士--自定义控件(获取焦点的TextView)

    本文地址:http://www.cnblogs.com/wuyudong/p/5906735.html,转载请注明源地址. 本文将实现标题栏下面的textview中的文字跑马灯的效果,就是将一行文字水 ...

  4. 新浪微博客户端(36)-自定义带placeholder的TextView

    iOS 上自带的UITextView竟然不能设置placeholder,但是UITextView却可以,我也真是醉了.没办法了,自己写一个 DJTextView.h #import <UIKit ...

  5. android自定义控件实例(Linearlayout组合TextView和ImageView)

    2013-12-18 11:25:22 转载自: http://www.open-open.com/lib/view/open1328836804515.html 很多时候android常用的控件不能 ...

  6. Android 如何实现带滚动条的TextView,在更新文字时自动滚动到最后一行?

    1.在布局文件中放置一个TextView,给它添加scrollbars和fadeScrollbars两个属性. 如下设置:滚动条为垂直滚动条,并且一直可见(当TextView中的文字行数超过页面能显示 ...

  7. android 自定义组件-带图片的textView

    1. 定义属性 <?xml version="1.0" encoding="utf-8"?> <resources> <decla ...

  8. 学习下关于ViewStub实例的用法及带Drawable的TextView的妙用

    在项目中,我们可能有多种数据来源比如: 里面有ListView也有当获得数据为空的时候显示的空信息.根据点击的项目还是差事不同,显示的空消息也不同.a.没有收藏的项目,b目前没有收藏的差事. 其实实现 ...

  9. 跑马灯带你深入浅出TextView的源码世界

    一.背景 想必大家平时也没那么多时间是单独看源码,又或者只是单纯的看源码遇到问题还是不知道怎么从源码的角度解决. 但是大家平时开发过程中肯定会遇到这样或那样的小问题,通过百度.Google搜索都无果, ...

随机推荐

  1. 武汉科技大学ACM:1007: 陶陶摘苹果

    Problem Description 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试. 个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹 ...

  2. Caused by: org.apache.ibatis.ognl.OgnlException: source is null for getProperty(null, "mil_id")

    今天在使用mybatis处理数据库的时候,突然抛出了上述异常,让我感到很惊讶,因为在处理save的时候,在Mybatis的配置文件中,我根本就没有使用到ognl表达式,系统怎么会抛出上述异常.而且之前 ...

  3. Android中的动画

    Android中的动画分为: 1.逐帧动画(Frame Animation):  把动画过程的每张静态图片都收集起来,然后由Android来控制依次显示这些静态图片,然后利用人眼”视觉暂留“的原理,给 ...

  4. @NotNull丶@NotBlank丶@NotEmpty

    1.@NotNull:不能为 Null,但是可以为Empty:用在基本数据类型上. @NotNull(message="{state.notnull.valid}", groups ...

  5. linux笔记2.24

    安装vsftpd mount /dev/cdrom /mnt cp vsftpd-1.1.3-8.i386.rpm /home/soccer/ chmod 777 vsftpd-1.1.3-8.i38 ...

  6. php global范例

    Example #1 $GLOBALS 范例 <?phpfunction test() {    $foo = "local variable"; echo '$foo in ...

  7. eclipse 新建servlet

    在mac下的eclipse新建servlet报错: 解决一: --------------------------------- 解决二: 在右键项目名称中,打开 Properties->jav ...

  8. 一个简单LINUX程序的逆向

    开始之前的准备: 反汇编:IDA 十六进制编辑器: Hexworkshop LINUX环境: KALI LINUX 调试: EDB (KALI自带的) 一个简单的动态追码, 大牛们就略过吧…… 用16 ...

  9. 转:Spine.JS+Rails重客户端Web应用技术选型思路:『风车』架构设计

    原文来自于:http://www.infoq.com/cn/articles/fengche-co-architecture 风车这个项目开始于 2011 年 11 月份,之前叫做 Pragmatic ...

  10. 健身计划_from85to75

    第一天没什么好写的,这半年也没看什么书,就写写未来的规划好了. 当然是从最简单的健身计划开始写咯. 关键词:弹性 目标:减肥,上肢力量 时间:3-4次/周(Thur,Fri,Sat,Sun),1h-1 ...