自定义控件 带描边的TextView
使用
public class MainActivity extends Activity {@Overrideprotected 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、setMarginsStrokeTextView 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.StrokeTextViewandroid: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.StrokeTextViewandroid: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();}@Overrideprotected 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);}@Overrideprotected 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);}@Overridepublic void setLayoutParams(ViewGroup.LayoutParams params) {super.setLayoutParams(params);strokeTextView.setLayoutParams(params);}@Overridepublic void setBackgroundResource(int resid) {super.setBackgroundResource(resid);strokeTextView.setBackgroundResource(resid);}@Overridepublic void setTextSize(float size) {super.setTextSize(size);strokeTextView.setTextSize(size);}@Overridepublic void setTextSize(int unit, float size) {super.setTextSize(unit, size);strokeTextView.setTextSize(unit, size);}@Overridepublic void setPadding(int left, int top, int right, int bottom) {super.setPadding(left, top, right, bottom);strokeTextView.setPadding(left, top, right, bottom);}}
自定义控件 带描边的TextView的更多相关文章
- Android自定义控件 -- 带边框的TextView
使用xml实现边框 原来使用带边框的TextView时一般都是用XML定义来完成,在drawable目录中定义如下所示的xml文件: <?xml version="1.0" ...
- 李洪强iOS开发之带placeHolder的Textview
李洪强iOS开发之带placeHolder的Textview 01 - 创建工过程,定义全局属性,遵守textview的代理协议 02 - 添加一个textview和一个label 03 - 实现 ...
- Android 手机卫士--自定义控件(获取焦点的TextView)
本文地址:http://www.cnblogs.com/wuyudong/p/5906735.html,转载请注明源地址. 本文将实现标题栏下面的textview中的文字跑马灯的效果,就是将一行文字水 ...
- 新浪微博客户端(36)-自定义带placeholder的TextView
iOS 上自带的UITextView竟然不能设置placeholder,但是UITextView却可以,我也真是醉了.没办法了,自己写一个 DJTextView.h #import <UIKit ...
- android自定义控件实例(Linearlayout组合TextView和ImageView)
2013-12-18 11:25:22 转载自: http://www.open-open.com/lib/view/open1328836804515.html 很多时候android常用的控件不能 ...
- Android 如何实现带滚动条的TextView,在更新文字时自动滚动到最后一行?
1.在布局文件中放置一个TextView,给它添加scrollbars和fadeScrollbars两个属性. 如下设置:滚动条为垂直滚动条,并且一直可见(当TextView中的文字行数超过页面能显示 ...
- android 自定义组件-带图片的textView
1. 定义属性 <?xml version="1.0" encoding="utf-8"?> <resources> <decla ...
- 学习下关于ViewStub实例的用法及带Drawable的TextView的妙用
在项目中,我们可能有多种数据来源比如: 里面有ListView也有当获得数据为空的时候显示的空信息.根据点击的项目还是差事不同,显示的空消息也不同.a.没有收藏的项目,b目前没有收藏的差事. 其实实现 ...
- 跑马灯带你深入浅出TextView的源码世界
一.背景 想必大家平时也没那么多时间是单独看源码,又或者只是单纯的看源码遇到问题还是不知道怎么从源码的角度解决. 但是大家平时开发过程中肯定会遇到这样或那样的小问题,通过百度.Google搜索都无果, ...
随机推荐
- void *memmove( void* dest, const void* src, size_t count );数据拷贝,不需要CPU帮助
分享到 腾讯微博 QQ空间 新浪微博 人人网 朋友网 memmove 编辑词条 编辑词条 --> memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,m ...
- Oracle数据库之PL/SQL过程与函数
Oracle数据库之PL/SQL过程与函数 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据 ...
- JS之对象数组遍历?
一.js实现遍历对象 <script> ","destroy":"97%"}; var props = ""; for ...
- centos 下 apache 重启启动命令
apache 启动 usr/local/apache243/bin/apachectl start apache 重启 usr/local/apache243/bin/apachectl restar ...
- 用c++11打造类似于python的range
python中的range函数表示一个连续的有序序列,range使用起来很方便,因为在定义时就隐含了初始化过程,因为只需要给begin()和end()或者仅仅一个end(),就能表示一个连续的序列.还 ...
- python os.walk()遍历
os.walk()遍历 import os p='/bin' #设定一个路径 for i in os.walk(p): #返回一个元组 print (i) # i[0]是路径 i[1]是文件夹 i[2 ...
- 《python基础教程》笔记之 基础知识
数字相关 在Python程序前加上 from __future__ import division 或者在解释器里面直接执行它,或者通过命令行运行Python时使用命令开关-Qnew,会使单斜线不再整 ...
- laravel中StartSession中间件的问题
今天使用了laravel的dingoapi插件做了一些功能,但是最后遇到一个问题,我在页面和api的路由组中都加了一个相同的以session为基础的身份验证中间件,然后我以管理员身份登录页面时通过了验 ...
- sublime 使用快捷记录
1.sublime 中有一个htmlprettify 插件 这个插件 可以用来格式化 html css js 使我们的代码看着比较美观 ctrl + shift + h 这个快捷方式是美化代码间距的 ...
- Dropbox可伸缩性设计最佳实践分享
http://www.infoq.com/cn/news/2012/11/dropbox-scale-bestpractice Dropbox的运维工程师Rajiv,跟大家分享了可伸缩性设计的最佳实践 ...
