Android Studio 运行 Skia

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
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

forevermgg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值