Android渲染器Shader:LinearGradient(一)

简介: Android渲染器Shader:LinearGradient(一)LinearGradient是Android的线性渲染器。


Android渲染器Shader:LinearGradient(一)

LinearGradient是Android的线性渲染器。我写5个LinearGradient渲染器渲染后的View表现结果。其中,LinearGradient 1,2,3只是修改渲染器的渲染模式,LinearGradient 1为重复(repeat),LinearGradient 2为镜像模式(mirror),LinearGradient 3为拉伸(clamp)。注意到LinearGradient 3在拉伸模式下,如果设定的LinearGradient不足以渲染整个画面,那么将拉伸最后一个颜色(我写的这个例子是蓝色Color.BLUE)。
LinearGradient 4和5则只是为了演示构造LinearGradient的float x0, float y0, float x1, float y1在复杂设置后会形成的画面渲染效果。
以LinearGradient 4为例,如果设定x0=0,y0=0,x1=300,y1=300,那么就是从左上角往右下角沿这个300 X 300的正方形的左上——右下对称轴渲染。

写一个完整代码。
先写一个LinearGradientView,这个LinearGradient继承自View:

package zhangphil.demo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.graphics.Shader;
import android.view.View;

public class LinearGradientView extends View {

	private LinearGradient linearGradient1 = null;
	private Paint paint1 = null;

	private LinearGradient linearGradient2 = null;
	private Paint paint2 = null;

	private LinearGradient linearGradient3 = null;
	private Paint paint3 = null;

	private LinearGradient linearGradient4 = null;
	private Paint paint4 = null;

	private LinearGradient linearGradient5 = null;
	private Paint paint5 = null;

	public LinearGradientView(Context context) {
		super(context);

		linearGradient1 = new LinearGradient(0, 0, 300, 0, new int[] { Color.RED, Color.YELLOW, Color.BLUE }, null,
				Shader.TileMode.REPEAT);
		paint1 = new Paint();

		linearGradient2 = new LinearGradient(0, 0, 300, 0, new int[] { Color.RED, Color.YELLOW, Color.BLUE }, null,
				Shader.TileMode.MIRROR);
		paint2 = new Paint();

		linearGradient3 = new LinearGradient(0, 0, 300, 0, new int[] { Color.RED, Color.YELLOW, Color.BLUE }, null,
				Shader.TileMode.CLAMP);
		paint3 = new Paint();

		linearGradient4 = new LinearGradient(0, 0, 300, 300, new int[] { Color.RED, Color.YELLOW, Color.BLUE }, null,
				Shader.TileMode.REPEAT);
		paint4 = new Paint();

		linearGradient5 = new LinearGradient(0, 300, 300, 0, new int[] { Color.RED, Color.YELLOW, Color.BLUE }, null,
				Shader.TileMode.REPEAT);
		paint5 = new Paint();
	}

	public LinearGradientView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);

		int left = 10, top = 20, right = 0, bottom = 0;
		// 渲染到View的最右边
		right = this.getWidth() - left;

		// 渲染的每一个矩形高度,也可以简单理解为坐标系的结束值y
		bottom = this.getHeight() / 5;

		// 渲染器1
		paint1.setShader(linearGradient1);
		Rect rect1 = new Rect(left, top, right, bottom);
		canvas.drawRect(rect1, paint1);

		top = top + bottom;
		// 渲染器2
		paint2.setShader(linearGradient2);
		Rect rect2 = new Rect(left, top, right, bottom * 2);
		canvas.drawRect(rect2, paint2);

		top = top + bottom;
		// 渲染器3
		paint3.setShader(linearGradient3);
		Rect rect3 = new Rect(left, top, right, bottom * 3);
		canvas.drawRect(rect3, paint3);

		top = top + bottom;
		// 渲染器4
		paint4.setShader(linearGradient4);
		Rect rect4 = new Rect(left, top, right, bottom * 4);
		canvas.drawRect(rect4, paint4);

		top = top + bottom;
		// 渲染器5
		paint5.setShader(linearGradient5);
		Rect rect5 = new Rect(left, top, right, bottom * 5);
		canvas.drawRect(rect5, paint5);
	}
}


简单期间,直接在Activity里面的setContentView里面加载:

package zhangphil.demo;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		LinearGradientView linearGradientView= new LinearGradientView(this); ;
		setContentView(linearGradientView);
	}
}


代码运行结果:


相关文章
|
XML JSON 缓存
让UI忙碌的安卓Lottie动画渲染库(二)
上节我们讲述了Lottie开源库如何导入Android Studio但是,开源库是不断迭代的,所以我们也要及时更新
766 0
|
编解码 开发工具 Android开发
Android平台RTSP|RTMP播放器如何实现TextureView渲染
本文介绍了在Android平台上使用TextureView进行RTSP和RTMP视频流渲染的技术背景和实现方法。TextureView相较于SurfaceView具备更高性能、更强功能性和更灵活的绘制方式等优势,但也有必须在硬件加速环境下运行和较高内存占用等局限。文中详细展示了如何在SmartPlayerV2工程中创建和配置TextureView,并通过代码示例解释了如何根据视频分辨率信息调整显示比例,以及处理TextureView的各种生命周期回调。此外,还列举了该播放器SDK支持的多项高级功能,如多实例播放、多种编码格式支持、硬解码能力等,旨在帮助开发者更好地理解和实现高性能的直播播放器。
334 3
|
前端开发 Android开发
前端项目实战壹-安卓4.4/6.0无法安装非原生项目无法渲染样式
前端项目实战壹-安卓4.4/6.0无法安装非原生项目无法渲染样式
162 0
|
Android开发 开发者
Android开发之通过渲染纹理展示地球仪
该文阐述了如何使用OpenGL为三维物体添加纹理,以增强其真实感。纹理坐标是二维的,用于标记摊平后的“布料”对应物体的哪个部位,类似裁缝制作衣服的过程。在OpenGL中,启用纹理和深度测试是关键,还包括设置纹理参数、分配纹理编号、绑定位图材质等步骤。计算材质的纹理坐标后,通过`glDrawArrays`结合顶点和纹理坐标逐个贴图。最终示例展示了将世界地图贴到球体上形成逼真的地球仪效果。通过控制旋转、平移和缩放,能实现简单的三维动画效果。
214 2
Android开发之通过渲染纹理展示地球仪
|
XML Java Android开发
Android App开发手机阅读中PDF文件渲染器的讲解及使用(附源码 简单易懂)
Android App开发手机阅读中PDF文件渲染器的讲解及使用(附源码 简单易懂)
453 0
|
XML JSON 前端开发
让UI忙碌的安卓Lottie动画渲染库(一)
今天工作时突然在项目xml布局看到了一个完全不认识的控件,一开始以为是自定义View之类的:
430 0
|
XML 存储 定位技术
Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据
Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据
311 0
Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据
|
API Android开发
Android 天气APP(五)天气预报、生活指数的数据请求与渲染(下)
Android 天气APP(五)天气预报、生活指数的数据请求与渲染(下)
220 0
Android 天气APP(五)天气预报、生活指数的数据请求与渲染(下)
|
API Android开发
Android 天气APP(五)天气预报、生活指数的数据请求与渲染(上)
Android 天气APP(五)天气预报、生活指数的数据请求与渲染(上)
546 0
Android 天气APP(五)天气预报、生活指数的数据请求与渲染(上)
|
缓存 算法 Java
Android硬件加速(二)-RenderThread与OpenGL GPU渲染
Android硬件加速(二)-RenderThread与OpenGL GPU渲染
1429 0
Android硬件加速(二)-RenderThread与OpenGL GPU渲染

热门文章

最新文章