使用


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. Uncaught TypeError: Cannot set property 'innerHTML' of null

    学习Chrome插件时,要在弹出页面中显示当前时间,结果怎样也显示不出来 看了 http://www.cnblogs.com/mfryf/p/3701801.html 这篇文章后感悟颇深 通过调试发现 ...

  2. InnoDB概览

    InnoDB 采用了MVCC来支持高并发,并且实现了四个标准的隔离级别.其默认级别是REPEATABLE READ(可重复读) ,并且,通过间隙锁(next-key locking)策略防止幻读的出现 ...

  3. TreeView无刷新获取text及value

    前台代码: <html xmlns="http://www.w3.org/1999/xhtml"><head id="Head1" runat ...

  4. 破解tumblr背景音乐

    http://sex.tumblr.com/api/read/json?callback=streampadPlayerBlogV2.getAudioResponse&type=audio&a ...

  5. 【创建型】Builder模式

    生成器模式的主要思想:将产品对象的创建与表现分离开,并且同样的创建过程可以有不同的产品表现. 直白一点可以理解为:待创建的对象是复杂的,一般情况下是需要经过多个步骤的创建后,最终才能将完整产品创建好, ...

  6. hibernate3 无法查询中文问题

    在查询中文时  hql语句在生成的语句中把中文显示为乱码 则在hibernate配置文件中加入: <property name="hibernate.query.factory_cla ...

  7. 50个PHOTOSHOP快捷键技能!

    一.常用的热键组合 1.图层混合模式快捷键:正常(Shift + Option + N),正片叠底(Shift + Option + M),滤色(Shift + Option + S),叠加(Shif ...

  8. linux命令中"|"管道流的意思

    在linux中.可以利用符号:"|"来实现管道功能. 那么什么是管道功能呢: 管道是Shell的一大特征.他将多个命令前后连接起来形成一个管道流. 管道流中的每一个命令都作为一个单 ...

  9. ASP.NET Email + WebConfig

    这里演示如果把 Email provider 的资料写在 WebConfig 里和调用它. 如果整个项目只需要使用一个 Email, 可以写入system.net里, 微软已经帮我们设计好了 < ...

  10. ISAP

    跑的是比Dinic快辣. 更新:指针版.... #include<iostream> #include<cstdio> #include<cmath> #inclu ...