Android Skia 库位置
将头文件和so放到app/src/main/cpp/skia/libs 目录下
Cmake
include
#头文件目录
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/skia/libs)
INCLUDE_DIRECTORIES(${PROJECT_SOURCE_DIR}/skia/src)
LINK_DIRECTORIES(${PROJECT_SOURCE_DIR}/skia/libs/${ANDROID_ABI})
message("ANDROID_ABI : ${ANDROID_ABI}")
set(SK_GL=1)
add_definitions(-DSK_GL=1)
link
#添加链接库
target_link_libraries( # Specifies the target library.
skiatest
EGL
GLESv2
GLESv3
OpenSLES
android
atomic
jnigraphics
nativewindow
log
libcpu-features.a
libdng_sdk.a
libexpat.a
libfreetype2.a
libharfbuzz.a
libicu.a
libjpeg.a
libparticles.a
libpiex.a
libpng.a
libskia.a
libskottie.a
libskparagraph.a
libskresources.a
libsksg.a
libskshaper.a
libsvg.a
libwebp.a
libwebp_sse41.a
libzlib.a)
app/build.gradle
externalNativeBuild {
cmake {
cppFlags '-std=c++17'
}
}
app/src/main/AndroidManifest.xml
<uses-feature android:glEsVersion="0x00030002" android:required="true" />
测试
SkiaDrawView
package com.mgg.skiatest;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.os.SystemClock;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
public class SkiaDrawView extends View {
Bitmap fSkiaBitmap;
public SkiaDrawView(Context context) {
super(context);
}
public SkiaDrawView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public SkiaDrawView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public SkiaDrawView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh)
{
// Create a bitmap for skia to draw into
fSkiaBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
}
@Override
protected void onDraw(Canvas canvas) {
// Call into our C++ code that renders to the bitmap using Skia
drawIntoBitmap(fSkiaBitmap, SystemClock.elapsedRealtime());
// Present the bitmap on the screen
canvas.drawBitmap(fSkiaBitmap, 0, 0, null);
}
private native void drawIntoBitmap(Bitmap image, long elapsedTime);
}
skia drawIntoBitmap
extern "C" JNIEXPORT void JNICALL
Java_com_mgg_skiatest_SkiaDrawView_drawIntoBitmap(JNIEnv* env, jobject thiz,
jobject dstBitmap,
jlong elapsedTime) {
AndroidBitmapInfo dstInfo;
void* dstPixels;
AndroidBitmap_getInfo(env, dstBitmap, &dstInfo);
AndroidBitmap_lockPixels(env, dstBitmap, &dstPixels);
SkImageInfo info = SkImageInfo::MakeN32Premul(dstInfo.width, dstInfo.height);
sk_sp<SkSurface> surface(
SkSurface::MakeRasterDirect(info, dstPixels, dstInfo.stride));
SkCanvas* canvas = surface->getCanvas();
canvas->drawColor(SK_ColorWHITE);
SkPaint paint;
paint.setColor(SK_ColorBLACK);
paint.setAntiAlias(true);
paint.setAntiAlias(false);
paint.setColor(0xFF0000FF);
paint.setStrokeWidth(SkIntToScalar(2));
SkPaint greenPaint;
greenPaint.setColor(0xff008000);
SkPaint blackPaint;
blackPaint.setColor(0xff000000);
SkPaint whitePaint;
whitePaint.setColor(0xffffffff);
SkPaint layerPaint;
layerPaint.setColor(0xff000000);
auto surf = SkSurface::MakeRasterN32Premul(100, 100);
surf->getCanvas()->clear(0xffffffff);
SkPaint circlePaint;
circlePaint.setColor(0xff000000);
surf->getCanvas()->drawCircle(50, 50, 50, circlePaint);
sk_sp<SkImage> fCircleImage;
fCircleImage = surf->makeImageSnapshot();
canvas->drawImageRect(fCircleImage, SkRect::MakeXYWH(20, 20, 60, 60),
SkSamplingOptions(), &greenPaint);
SkRect canvasRect(SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100)));
canvas->saveLayer(nullptr, &blackPaint);
canvas->drawRect(canvasRect, greenPaint);
canvas->saveLayer(nullptr, &layerPaint);
canvas->drawImageRect(fCircleImage, SkRect::MakeXYWH(20, 20, 60, 60),
SkSamplingOptions(), &blackPaint);
canvas->restore();
canvas->restore();
/*for (int i = 0; i < 100; i++) {
float x = (float)i / 99.0f;
float offset = elapsedTime / 1000.0f;
canvas->drawLine(sin(x * M_PI + offset) * 800.0f, 0,
cos(x * M_PI + offset) * 800.0f, 800, paint);
}*/
// Canvas_drawPicture_2(canvas);
// Canvas_drawPicture_3(canvas);
// Canvas_drawPicture_4(canvas);
// Image_MakeFromPicture(canvas);
// Picture_008(canvas);
// Picture_cullRect(canvas);
// Picture_playback(canvas);
// f16to8888busted(canvas);
serial_procs_picture(canvas);
AndroidBitmap_unlockPixels(env, dstBitmap);
}
验证
<com.mgg.skiatest.SkiaDrawView
android:id="@+id/mSkiaDrawView"
android:layout_width="200dp"
android:layout_height="200dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintStart_toStartOf="parent"/>
源代码
- https://github.com/forevermgg/SkiaTest