Skip to content

Commit 2979634

Browse files
Canvas implementation for Android (android.view.View) (#31)
1 parent 21a8cab commit 2979634

File tree

107 files changed

+3115
-705
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+3115
-705
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* Copyright (c) 2023. JetBrains s.r.o.
3+
* Use of this source code is governed by the MIT license that can be found in the LICENSE file.
4+
*/
5+
6+
plugins {
7+
kotlin("android")
8+
id("com.android.application")
9+
}
10+
11+
android {
12+
compileSdk = (findProperty("android.compileSdk") as String).toInt()
13+
namespace = "demo.plot.view"
14+
15+
defaultConfig {
16+
applicationId = "demo.plot.view"
17+
18+
minSdk = (findProperty("android.minSdk") as String).toInt()
19+
targetSdk = (findProperty("android.targetSdk") as String).toInt()
20+
21+
versionCode = 1
22+
versionName = "1.0"
23+
24+
ndk {
25+
abiFilters += listOf("x86_64", "arm64-v8a")
26+
}
27+
}
28+
29+
buildTypes {
30+
debug {
31+
isDebuggable = true
32+
}
33+
}
34+
35+
compileOptions {
36+
sourceCompatibility = JavaVersion.VERSION_11
37+
targetCompatibility = JavaVersion.VERSION_11
38+
}
39+
40+
kotlin {
41+
jvmToolchain(11)
42+
}
43+
}
44+
45+
val letsPlotVersion = extra["letsPlot.version"] as String
46+
val letsPlotKotlinVersion = extra["letsPlotKotlin.version"] as String
47+
48+
dependencies {
49+
implementation(project(":platf-skia"))
50+
implementation(project(":demo-plot-shared"))
51+
implementation("org.jetbrains.lets-plot:lets-plot-kotlin-kernel:${letsPlotKotlinVersion}")
52+
implementation("org.jetbrains.lets-plot:lets-plot-common:$letsPlotVersion")
53+
implementation("org.jetbrains.lets-plot:canvas:${letsPlotVersion}")
54+
implementation("org.jetbrains.lets-plot:plot-raster:$letsPlotVersion")
55+
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
3+
xmlns:tools="http://schemas.android.com/tools" >
4+
5+
<application
6+
android:allowBackup="true"
7+
android:debuggable="true"
8+
android:icon="@mipmap/ic_launcher"
9+
android:label="@string/app_name"
10+
android:roundIcon="@mipmap/ic_launcher_round"
11+
android:supportsRtl="true"
12+
tools:ignore="HardcodedDebugMode" >
13+
<activity
14+
android:name="demo.plot.view.PlotGirdDemoActivity"
15+
android:exported="true">
16+
<intent-filter>
17+
<action android:name="android.intent.action.MAIN" />
18+
19+
<category android:name="android.intent.category.LAUNCHER" />
20+
</intent-filter>
21+
</activity>
22+
23+
<activity
24+
android:name="demo.plot.view.ResizingWithFitContainerSizePolicyDemoActivity"
25+
android:exported="true">
26+
<intent-filter>
27+
<action android:name="android.intent.action.MAIN" />
28+
29+
<category android:name="android.intent.category.LAUNCHER" />
30+
</intent-filter>
31+
</activity>
32+
33+
<activity
34+
android:name="demo.plot.view.ResizingWithFixedPlotSizePolicyDemoActivity"
35+
android:exported="true">
36+
<intent-filter>
37+
<action android:name="android.intent.action.MAIN" />
38+
39+
<category android:name="android.intent.category.LAUNCHER" />
40+
</intent-filter>
41+
</activity>
42+
43+
44+
<!-- android:theme="@style/Theme.AppCompat.Light"> -->
45+
<!-- android:theme="@style/Theme.AppCompat.Light.NoActionBar"> -->
46+
<activity
47+
android:name="demo.plot.view.DensityPlotDemoActivity"
48+
android:exported="true" >
49+
<intent-filter>
50+
<action android:name="android.intent.action.MAIN" />
51+
52+
<category android:name="android.intent.category.LAUNCHER" />
53+
</intent-filter>
54+
</activity>
55+
56+
</application>
57+
58+
</manifest>
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright (c) 2025 JetBrains s.r.o.
3+
* Use of this source code is governed by the MIT license that can be found in the LICENSE file.
4+
*/
5+
6+
package demo.plot.view
7+
8+
import android.app.Activity
9+
import android.graphics.Color
10+
import android.os.Bundle
11+
import org.jetbrains.letsPlot.android.canvas.CanvasView
12+
import org.jetbrains.letsPlot.core.util.sizing.SizingPolicy
13+
import org.jetbrains.letsPlot.intern.toSpec
14+
import org.jetbrains.letsPlot.raster.builder.MonolithicCanvas
15+
import plotSpec.DensitySpec
16+
17+
class DensityPlotDemoActivity : Activity() {
18+
override fun onCreate(savedInstanceState: Bundle?) {
19+
super.onCreate(savedInstanceState)
20+
21+
val plotFigure = DensitySpec().createFigure()
22+
23+
setContentView(
24+
CanvasView(this).apply {
25+
figure = MonolithicCanvas.buildPlotFigureFromRawSpec(
26+
rawSpec = plotFigure.toSpec(),
27+
sizingPolicy = SizingPolicy.fitContainerSize(false),
28+
computationMessagesHandler = {}
29+
)
30+
setBackgroundColor(Color.GREEN)
31+
}
32+
)
33+
}
34+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
/*
2+
* Copyright (c) 2025 JetBrains s.r.o.
3+
* Use of this source code is governed by the MIT license that can be found in the LICENSE file.
4+
*/
5+
6+
package demo.plot.view
7+
8+
import android.app.Activity
9+
import android.graphics.Color
10+
import android.os.Bundle
11+
import org.jetbrains.letsPlot.android.canvas.CanvasView
12+
import org.jetbrains.letsPlot.core.util.sizing.SizingPolicy
13+
import org.jetbrains.letsPlot.intern.toSpec
14+
import org.jetbrains.letsPlot.raster.builder.MonolithicCanvas
15+
import plotSpec.PlotGridSpec
16+
17+
class PlotGirdDemoActivity : Activity() {
18+
override fun onCreate(savedInstanceState: Bundle?) {
19+
super.onCreate(savedInstanceState)
20+
21+
val plotFigure = PlotGridSpec().createFigure()
22+
23+
setContentView(
24+
CanvasView(this).apply {
25+
figure = MonolithicCanvas.buildPlotFigureFromRawSpec(
26+
rawSpec = plotFigure.toSpec(),
27+
sizingPolicy = SizingPolicy.fitContainerSize(false),
28+
computationMessagesHandler = {}
29+
)
30+
setBackgroundColor(Color.GREEN)
31+
}
32+
)
33+
}
34+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
/*
2+
* Copyright (c) 2025 JetBrains s.r.o.
3+
* Use of this source code is governed by the MIT license that can be found in the LICENSE file.
4+
*/
5+
6+
package demo.plot.view
7+
8+
import android.app.Activity
9+
import android.graphics.Color
10+
import android.os.Bundle
11+
import demo.plot.view.ResizingWithFixedPlotSizePolicyDemoActivity.Companion.setupResizableCanvas
12+
import org.jetbrains.letsPlot.android.canvas.CanvasView
13+
import org.jetbrains.letsPlot.core.util.sizing.SizingPolicy
14+
import org.jetbrains.letsPlot.intern.toSpec
15+
import org.jetbrains.letsPlot.raster.builder.MonolithicCanvas
16+
import plotSpec.DensitySpec
17+
18+
class ResizingWithFitContainerSizePolicyDemoActivity: Activity() {
19+
override fun onCreate(savedInstanceState: Bundle?) {
20+
super.onCreate(savedInstanceState)
21+
val plotFigure = DensitySpec().createFigure()
22+
23+
val view = CanvasView(this).apply {
24+
figure = MonolithicCanvas.buildPlotFigureFromRawSpec(
25+
rawSpec = plotFigure.toSpec(),
26+
sizingPolicy = SizingPolicy.fitContainerSize(false),
27+
computationMessagesHandler = {}
28+
)
29+
setBackgroundColor(Color.GREEN)
30+
}
31+
32+
33+
34+
setupResizableCanvas(view)
35+
}
36+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright (c) 2025 JetBrains s.r.o.
3+
* Use of this source code is governed by the MIT license that can be found in the LICENSE file.
4+
*/
5+
6+
package demo.plot.view
7+
8+
import android.app.Activity
9+
import android.graphics.Color
10+
import android.os.Bundle
11+
import android.widget.FrameLayout
12+
import org.jetbrains.letsPlot.android.canvas.CanvasView
13+
import org.jetbrains.letsPlot.core.util.sizing.SizingPolicy
14+
import org.jetbrains.letsPlot.intern.toSpec
15+
import org.jetbrains.letsPlot.raster.builder.MonolithicCanvas
16+
import plotSpec.DensitySpec
17+
import java.util.*
18+
19+
class ResizingWithFixedPlotSizePolicyDemoActivity: Activity() {
20+
override fun onCreate(savedInstanceState: Bundle?) {
21+
super.onCreate(savedInstanceState)
22+
val plotFigure = DensitySpec().createFigure()
23+
24+
val view = CanvasView(this).apply {
25+
figure = MonolithicCanvas.buildPlotFigureFromRawSpec(
26+
rawSpec = plotFigure.toSpec(),
27+
sizingPolicy = SizingPolicy.keepFigureDefaultSize(),
28+
computationMessagesHandler = {}
29+
)
30+
setBackgroundColor(Color.GREEN)
31+
}
32+
33+
setupResizableCanvas(view)
34+
}
35+
36+
companion object {
37+
fun Activity.setupResizableCanvas(view: CanvasView) {
38+
setContentView(view)
39+
val resizeTask = object : TimerTask() {
40+
var width = 500
41+
var height = 500
42+
var dv = 2
43+
44+
override fun run() {
45+
runOnUiThread {
46+
if (width < 500 || width > 1000) {
47+
dv *= -1
48+
}
49+
50+
width += dv
51+
height += dv
52+
53+
view.layoutParams = FrameLayout.LayoutParams(width, height)
54+
}
55+
}
56+
}
57+
Timer().schedule(resizeTask, 0, 10)
58+
}
59+
60+
}
61+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<androidx.constraintlayout.widget.ConstraintLayout
3+
xmlns:android="http://schemas.android.com/apk/res/android"
4+
xmlns:tools="http://schemas.android.com/tools"
5+
android:id="@+id/main"
6+
android:layout_width="match_parent"
7+
android:layout_height="match_parent"
8+
tools:context="demo.plot.view.AnotherActivity">
9+
10+
</androidx.constraintlayout.widget.ConstraintLayout>

0 commit comments

Comments
 (0)