Step 1. Add the JitPack repository to your build file
Add it in your root settings.gradle at the end of repositories:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
Add it in your settings.gradle.kts at the end of repositories:
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url = uri("https://jitpack.io") }
}
}
Add to pom.xml
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
Add it in your build.sbt at the end of resolvers:
resolvers += "jitpack" at "https://jitpack.io"
Add it in your project.clj at the end of repositories:
:repositories [["jitpack" "https://jitpack.io"]]
Step 2. Add the dependency
dependencies {
implementation 'com.github.ChillingVan:android-openGL-canvas:1.5.4.0'
}
dependencies {
implementation("com.github.ChillingVan:android-openGL-canvas:1.5.4.0")
}
<dependency>
<groupId>com.github.ChillingVan</groupId>
<artifactId>android-openGL-canvas</artifactId>
<version>1.5.4.0</version>
</dependency>
libraryDependencies += "com.github.ChillingVan" % "android-openGL-canvas" % "1.5.4.0"
:dependencies [[com.github.ChillingVan/android-openGL-canvas "1.5.4.0"]]
此项目灵感来源:
感谢这些源代码提供者!
项目应用
提供的View是继承 GLSurfaceView 或 TextureView 的,可以使用这两种View的特性,特别是TextureView的特性。
另外,因为使用OpenGL在另一线程渲染,所以里面的 GLContinuousView 还提供能够实现高性能的动画的方法。(如果只要这个功能不要其它得话,那么我建议你直接继承View,见浅析Android的canvas性能)
与GPUImage对比:
sample:
// in root build.gradle
allprojects {
repositories {
jcenter()
maven { url "https://jitpack.io" }
}
}
// module build.gradle
dependencies {
implementation 'com.github.ChillingVan:android-openGL-canvas:v1.5.4.0'
}
public class MyGLView extends GLView {
public MyGLView(Context context) {
super(context);
}
public MyGLView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onGLDraw(ICanvasGL canvas) {
// draw things with canvas here
}
}
其中, GLContinuouslyView, GLTextureView, GLContinuousTextureView, GLMultiTexProducerView and GLMultiTexConsumerView 用法相似.
使用CanvasGL实现绘制
canvas.drawBitmap(textBitmap, left, top);
// transform
canvas.save();
canvas.rotate(rotateDegree, x, y);
canvas.drawBitmap(bitmap, left, top);
canvas.restore();
// or
CanvasGL.BitmapMatrix matrix = new CanvasGL.BitmapMatrix();
matrix.postScale(2.1f, 2.1f);
matrix.postRotate(90);
canvas.drawBitmap(bitmap, matrix);
// apply filter to the bitmap
textureFilter = new ContrastFilter(2.8f);
canvas.drawBitmap(bitmap, left, top, textureFilter);
可以与Camera结合,注意运行样例代码的时候尽量使用真机而不是模拟器。
如果不想使用View,可以使用 MultiTexOffScreenCanvas 实现脱离屏幕的绘制,然后使用getDrawingBitmap方法获取绘制的内容。
MediaPlayer
可以用 MediaPlayer 去解码视频,并绘制到 TextureView 上。 如果用本项目里的 GLSurfaceTextureProducerView ,那么还可以做视频处理。 结合AndroidInstantVideo的stream publisher,就能生成新视频。
这个GLCanvas不能绘制文本。只能先把文本转成Bitmap来绘制 可以使用AndroidCanvasHelper来画任意东西再转化为Bitmap给GLCanvas 这有同步和异步模式,视情况用对应的模式,详细请看例子。
为什么Bitmap修改后,再次绘制时并没更新?
因为没有调用canvasGL的invalidateTextureContent(bitmap)。改变了的Bitmap需要重新绑定texture。因为绑定需要耗时,所以库里面才不做成每次都重新绑定。
Copyright 2016 ChillingVan.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on
an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.