最近,我想用我的新项目做一些艺术性的事情,如标题所示,添加背景图像作为文本的背景,而不是典型的恒定颜色。具体来说,我有一个这个文本的渐变图像。
像这样的东西
通常我会期望一个xml可绘制资源文件类型解决方案,但是非常感谢任何简单的解决方案
编辑:
感谢所有着色器解决方案,但是为了问题,只有提供图像背景解决方案的答案才会被接受/给予赏金
答案 0 :(得分:6)
您可以将BitmapShader
应用于TextView
颜料。
myTextView.getPaint().setShader(new BitmapShader(myBitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP));
如果您不想使用图像,还有其他类型的着色器。文档为here。
答案 1 :(得分:5)
Shader 是在绘图过程中返回水平颜色范围的对象的基类。 Shader的子类安装在Paint中,调用paint.setShader(着色器) 。之后,使用该绘制绘制的任何对象(位图除外)都将从着色器中获取其颜色。
Bitmap bitmapObj = BitmapFactory.decodeResource(getResources(),R.drawable.your_image);
Shader shaderObj = new BitmapShader(bitmapObj,Shader.TileMode.REPEAT,Shader.TileMode.REPEAT);
textViewObj.getPaint().setShader(shaderObj);
textViewObj.setText("hello");
您应该拨打正确的 Shader.TileMode
您也可以关注
答案 2 :(得分:1)
您可以使用yourTextView.getPaint().setShader(new LinearGradient(...));
LinearGradient
有两个构造函数:
/** Create a shader that draws a linear gradient along a line.
@param x0 The x-coordinate for the start of the gradient line
@param y0 The y-coordinate for the start of the gradient line
@param x1 The x-coordinate for the end of the gradient line
@param y1 The y-coordinate for the end of the gradient line
@param colors The colors to be distributed along the gradient line
@param positions May be null. The relative positions [0..1] of
each corresponding color in the colors array. If this is null,
the the colors are distributed evenly along the gradient line.
@param tile The Shader tiling mode
*/
public LinearGradient(float x0, float y0, float x1, float y1, int colors[], float positions[], TileMode tile)
和
/** Create a shader that draws a linear gradient along a line.
@param x0 The x-coordinate for the start of the gradient line
@param y0 The y-coordinate for the start of the gradient line
@param x1 The x-coordinate for the end of the gradient line
@param y1 The y-coordinate for the end of the gradient line
@param color0 The color at the start of the gradient line.
@param color1 The color at the end of the gradient line.
@param tile The Shader tiling mode
*/
public LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, TileMode tile)
着色器的文档:
https://developer.android.com/reference/android/graphics/Shader.html
Shaders.TileMode的文档:
https://developer.android.com/reference/android/graphics/Shader.TileMode.html
另一种方式(作为想法而未经测试):
将文本转换为位图和drawable,然后使用GradientDrawable
答案 3 :(得分:1)
在drawable文件夹中创建gradient.xml。您可以设置角度以及开始和结束颜色。将此drawable设置为背景
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<gradient
android:startColor="#FFFFFF"
android:endColor="#00000000"
android:angle="45"/>
</shape>
答案 4 :(得分:0)
不是通过使用上面的答案建议的着色器和东西来给gpu /系统加载,而是建议你使用相对布局。
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/your_imageview_id"
android:layout_width="fill_parent"
android:layout_height="As_you_want_dp"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:scaleType="fitXY"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/your_textview_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginTop="20dp"
android:layout_centerHorizontal="true" />
</RelativeLayout>