android开发步步为营之104:文字加阴影效果和描边效果的实现
2016-05-20 20:03
579 查看
有时候为了文字的美观,我们需要给文字加阴影,或者加边框,这个效果怎么实现呢?最近项目里也用到了,这里总结一下。
一、文字加阴影效果
1、通过xml实现
<TextView
android:id="@+id/txt_shadom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:shadowColor="#ff0000ff"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:text="Shadom"
android:textColor="#000000"
android:textSize="30sp" />
2、通过代码实现
//设置阴影效果
TextView txtShadom =(TextView)findViewById(R.id.txt_shadom);
txtShadom.setShadowLayer(2,1,1, Color.parseColor("#ff0000"));
参考文档:关于Paint
setShadowLayer
Added in API level 1
This draws a shadow layer below the main layer, with the specified offset and color, and blur radius. If radius is 0, then the shadow layer is removed.
Can be used to create a blurred shadow underneath text. Support for use with other drawing operations is constrained to the software rendering pipeline.
The alpha of the shadow will be the paint's alpha if the shadow color is opaque, or the alpha from the shadow color if not.
二、文字描边效果
最近,我们有个需求,要给impact字体加外边框,一开始我的的思路是,这应该是impact的另外一种字体,但是网上都没有找到,后来,通过查找资料,目前加外边框的效果的一种实现方法是通过上下两层的textview通过的不同的字体颜色的叠加来实现的,这里,我也是这么实现的。
1、通过TextView叠加来展示
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txt_typeface"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/hello_world"
android:textColor="#000000"
android:textSize="30sp" />
<TextView
android:id="@+id/txt_typeface1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/hello_world"
android:textColor="#ffffff"
android:textSize="30sp" />
</FrameLayout>
2、将描边效果文字绘制到图片中
public static Bitmap createMeme(Context context, Bitmap bitmapOriginal, int textColor, ArrayList<MemeTextNew> memeTexts) {
if (memeTexts.size() == 0) {
return bitmapOriginal;
}
int width = bitmapOriginal.getWidth(), height = bitmapOriginal.getHeight();
System.out.println("宽" + width + "高" + height);
Bitmap bmpMeme = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); //建立一个空的BItMap
Canvas canvas = new Canvas(bmpMeme);//初始化画布绘制的图像到icon上
Paint photoPaint = new Paint(); //建立画笔
photoPaint.setDither(true); //获取跟清晰的图像采样
photoPaint.setFilterBitmap(true);//过滤一些
Rect src = new Rect(0, 0, width, height);//创建一个指定的新矩形的坐标
Rect dst = new Rect(0, 0, width, height);//创建一个指定的新矩形的坐标
canvas.drawBitmap(bitmapOriginal, src, dst, photoPaint);//将photo 缩放或则扩大到 dst使用的填充区photoPaint
for (MemeTextNew memeText : memeTexts) {
TextPaint textPaint = new TextPaint();
textPaint.setColor(textColor);
textPaint.setAntiAlias(true);
/**
if (memeText.getContent().length() > 60) {
textPaint.setTextSize(CommonUtil.sp2px(context, 14));
//textPaint.setTextSize(16);
} else {
textPaint.setTextSize(CommonUtil.sp2px(context, 20));
//textPaint.setTextSize(20);
}
**/
//20160519改成自动获取
textPaint.setTextSize(memeText.getTextSize());
textPaint.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/impact.ttf"));
if (StringUtil.isNotEmpty(memeText.getContent())) {
//设置边框效果的背景文字,颜色为黑色
TextPaint strokeTextPaint = new TextPaint();
strokeTextPaint.setColor(Color.BLACK);
strokeTextPaint.setStrokeWidth(5);
strokeTextPaint.setStyle(Paint.Style.FILL_AND_STROKE);
strokeTextPaint.setAntiAlias(textPaint.isAntiAlias());
strokeTextPaint.setTextSize(textPaint.getTextSize());
strokeTextPaint.setTypeface(textPaint.getTypeface());
StaticLayout strokeLayout = new StaticLayout(memeText.getContent(), strokeTextPaint, (int) memeText.getWidth(), Layout.Alignment.ALIGN_CENTER, 1.0F, 0.0F, true);
canvas.translate(memeText.getX(), memeText.getY());
strokeLayout.draw(canvas);
//绘制前景色文字
StaticLayout layout = new StaticLayout(memeText.getContent(), textPaint, (int) memeText.getWidth(), Layout.Alignment.ALIGN_CENTER, 1.0F, 0.0F, true);
// canvas.translate(memeText.getX(), memeText.getY());
layout.draw(canvas);
//20160516绘制完成回到原点
// canvas.translate(-memeText.getX(), -memeText.getY());
}
}
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return bmpMeme;
}
一、文字加阴影效果
1、通过xml实现
<TextView
android:id="@+id/txt_shadom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:shadowColor="#ff0000ff"
android:shadowDx="2"
android:shadowDy="2"
android:shadowRadius="1"
android:text="Shadom"
android:textColor="#000000"
android:textSize="30sp" />
2、通过代码实现
//设置阴影效果
TextView txtShadom =(TextView)findViewById(R.id.txt_shadom);
txtShadom.setShadowLayer(2,1,1, Color.parseColor("#ff0000"));
参考文档:关于Paint
setShadowLayer
Added in API level 1
void setShadowLayer (float radius, float dx, float dy, int shadowColor)
This draws a shadow layer below the main layer, with the specified offset and color, and blur radius. If radius is 0, then the shadow layer is removed.
Can be used to create a blurred shadow underneath text. Support for use with other drawing operations is constrained to the software rendering pipeline.
The alpha of the shadow will be the paint's alpha if the shadow color is opaque, or the alpha from the shadow color if not.
二、文字描边效果
最近,我们有个需求,要给impact字体加外边框,一开始我的的思路是,这应该是impact的另外一种字体,但是网上都没有找到,后来,通过查找资料,目前加外边框的效果的一种实现方法是通过上下两层的textview通过的不同的字体颜色的叠加来实现的,这里,我也是这么实现的。
1、通过TextView叠加来展示
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/txt_typeface"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/hello_world"
android:textColor="#000000"
android:textSize="30sp" />
<TextView
android:id="@+id/txt_typeface1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/hello_world"
android:textColor="#ffffff"
android:textSize="30sp" />
</FrameLayout>
//描边效果 TextView textView =(TextView)findViewById(R.id.txt_typeface); try { Typeface typeFace = Typeface.createFromAsset(getAssets(), "fonts/impact.ttf"); textView.setTypeface(typeFace); }catch (Exception e) { CommonUtil.printStackTrace(e); } TextPaint tp1 = textView.getPaint(); tp1.setStrokeWidth(5); tp1.setStyle(Paint.Style.FILL_AND_STROKE); // tp1.setFakeBoldText(true); tp1.setAntiAlias(true); TextView textView1 =(TextView)findViewById(R.id.txt_typeface1); try { Typeface typeFace = Typeface.createFromAsset(getAssets(), "fonts/impact.ttf"); textView1.setTypeface(typeFace); }catch (Exception e) { CommonUtil.printStackTrace(e); }
2、将描边效果文字绘制到图片中
public static Bitmap createMeme(Context context, Bitmap bitmapOriginal, int textColor, ArrayList<MemeTextNew> memeTexts) {
if (memeTexts.size() == 0) {
return bitmapOriginal;
}
int width = bitmapOriginal.getWidth(), height = bitmapOriginal.getHeight();
System.out.println("宽" + width + "高" + height);
Bitmap bmpMeme = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); //建立一个空的BItMap
Canvas canvas = new Canvas(bmpMeme);//初始化画布绘制的图像到icon上
Paint photoPaint = new Paint(); //建立画笔
photoPaint.setDither(true); //获取跟清晰的图像采样
photoPaint.setFilterBitmap(true);//过滤一些
Rect src = new Rect(0, 0, width, height);//创建一个指定的新矩形的坐标
Rect dst = new Rect(0, 0, width, height);//创建一个指定的新矩形的坐标
canvas.drawBitmap(bitmapOriginal, src, dst, photoPaint);//将photo 缩放或则扩大到 dst使用的填充区photoPaint
for (MemeTextNew memeText : memeTexts) {
TextPaint textPaint = new TextPaint();
textPaint.setColor(textColor);
textPaint.setAntiAlias(true);
/**
if (memeText.getContent().length() > 60) {
textPaint.setTextSize(CommonUtil.sp2px(context, 14));
//textPaint.setTextSize(16);
} else {
textPaint.setTextSize(CommonUtil.sp2px(context, 20));
//textPaint.setTextSize(20);
}
**/
//20160519改成自动获取
textPaint.setTextSize(memeText.getTextSize());
textPaint.setTypeface(Typeface.createFromAsset(context.getAssets(), "fonts/impact.ttf"));
if (StringUtil.isNotEmpty(memeText.getContent())) {
//设置边框效果的背景文字,颜色为黑色
TextPaint strokeTextPaint = new TextPaint();
strokeTextPaint.setColor(Color.BLACK);
strokeTextPaint.setStrokeWidth(5);
strokeTextPaint.setStyle(Paint.Style.FILL_AND_STROKE);
strokeTextPaint.setAntiAlias(textPaint.isAntiAlias());
strokeTextPaint.setTextSize(textPaint.getTextSize());
strokeTextPaint.setTypeface(textPaint.getTypeface());
StaticLayout strokeLayout = new StaticLayout(memeText.getContent(), strokeTextPaint, (int) memeText.getWidth(), Layout.Alignment.ALIGN_CENTER, 1.0F, 0.0F, true);
canvas.translate(memeText.getX(), memeText.getY());
strokeLayout.draw(canvas);
//绘制前景色文字
StaticLayout layout = new StaticLayout(memeText.getContent(), textPaint, (int) memeText.getWidth(), Layout.Alignment.ALIGN_CENTER, 1.0F, 0.0F, true);
// canvas.translate(memeText.getX(), memeText.getY());
layout.draw(canvas);
//20160516绘制完成回到原点
// canvas.translate(-memeText.getX(), -memeText.getY());
}
}
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
return bmpMeme;
}
相关文章推荐
- Android之ListView优化基本
- Android之ListView使用方法-ArrayAdapter-SimpleCursorAdapter-SimpleAdapter-BaseAdapter
- 从BaseActivity与BaseFragment的封装谈起
- Android Develop 之 Ddevelop WorkFlow Basics
- Android SDK Manager 国内无法更新的解决方案
- Android之ListView使用方法-SimpleAdapter-SimpleCursorAdapter
- Android之ListView使用方法-ArrayAdapter-SimpleAdapter-BaseAdapter
- Android 5.x Theme 与 ToolBar 实战
- Android学习_广播
- Android Studio进行单元测试
- Android之ListView使用方法-SimpleAdapter-两个TextView
- Android之Activity启动和结束方法-传递结果数据
- Android OpenGL20 世界坐标系,屏幕坐标系,纹理坐标系 <8>
- Java/Android 代码规范
- 如何把Android手机变成一个WIFI下载热点? — 报文转发及DNS报文拦截
- Android之Activity启动和结束方法-无传递结果数据
- Android项目结构分析
- Activity覆盖效果,可以用于底部弹出菜单。
- Android Studio上方便使用butterknife注解框架的偷懒插件Android Butterknife Zelezny
- android 应用内页面,截屏监听