自定义控件 带描边的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搜索都无果, ...
随机推荐
- MYSQL预处理传参不区分大小写解决办法
问题:预处理语句为:SELECT * FROM WHERE name=? 如果传送的参数为“admin” “ADmin” “ADMIN” “ADimn”等,结果处理后的语句为SELECT * FROM ...
- Swift - 37 - 值类型和引用类型的简单理解
//: Playground - noun: a place where people can play import UIKit // 值类型:指的是当一个变量赋值给另外一个变量的时候, 是copy ...
- php全局变量与局部变量中的使用
<?php //error handler function $v1=10; function f1() { //这里是把局部变成全局变量,也就是创建一个和外部同名的局部变量并通过“引用”的方式 ...
- 信息增益(IG,Information Gain)的理解和计算
决策树构建中节点的选择靠的就是信息增益了. 信息增益是一种有效的特征选择方法,理解起来很简单:增益嘛,肯定是有无这个特征对分类问题的影响的大小,这个特征存在的话,会对分类系统带来多少信息量,缺了他行不 ...
- AIDL Service
开发AIDL服务的步骤 AIDL(Android Interface Definition Language)是Service的一种重要应用,允许一个应用程序访问另一个应用程序中的对象. 建立AIDL ...
- javascript中的事件问题
事件的类型: (1)鼠标事件: click用户点击鼠标时发生,当用户的焦点在按钮上,并按了回车键,同样会触发这个事件 dbclick 用户双击鼠标左键时发生 mouseover 鼠标移出某个 ...
- showModalDialog-父窗体子窗体
showModalDialog使用例子,父窗口向子窗口传递值,子窗口设置父窗口的值,子窗口关闭的时候返回值到父窗口. farther.html --------------------------- ...
- 我自己的style
/** DATE:Time AUTHOR:Zoe TEAM:公司名称 INTRO:cssName **/ @charset "utf-8"; /*通用公共样式 开始*/ /* 清除 ...
- 关于机器学习-EM算法新解
我希望自己能通俗地把它理解或者说明白,但是,EM这个问题感觉真的不太好用通俗的语言去说明白,因为它很简单,又很复杂.简单在于它的思想,简单在于其仅包含了两个步骤就能完成强大的功能,复杂在于它的数学推理 ...
- Ubuntu 下升级git到最新版
$ sudo add-apt-repository ppa:git-core/ppa $ sudo apt-get update $ sudo apt-get install git
