GraphLib: Perpustakaan Android sumber terbuka untuk grafik

Grafik dan plot data adalah alat yang bagus untuk menggambarkan hubungan, menggambarkan tren data, dan tujuan penjejakan dalam aplikasi Android anda. Saya melihat ini sendiri beberapa tahun yang lalu, ketika seorang bekas pelajar saya memenangi tempat pertama dalam pertandingan aplikasi mudah alih pelajar yang ditaja oleh Persatuan Kontraktor Pertahanan Charleston. Ciri utama aplikasi yang menang, "Diabetes and Me," adalah kemampuan untuk membuat grafik tahap gula setiap hari.

Sebagai contoh lain, pertimbangkan aplikasi penekanan berat yang memajukan kemajuan dengan berat sasaran. Gambar 1 menggambarkan bagaimana aplikasi seperti itu dapat dilihat pada telefon Android. Angka tersebut menggunakan grafik garis merah untuk menunjukkan berat bulanan purata untuk tahun 2017. Ini menunjukkan berat gol sebagai garis lurus hijau berhampiran bahagian bawah. (Walaupun nilai data yang ditunjukkan dalam grafik garis adalah hipotetis, nilai tersebut realistik berkaitan dengan pengarang artikel ini.)

John I. Moore

Dalam artikel ini saya akan menggunakan perpustakaan sumber terbuka saya, GraphLib, untuk menunjukkan asas-asas fungsi matematik grafik di Android. Bukan pustaka grafik yang sama dengan yang digunakan oleh pelajar saya untuk aplikasinya. Sebenarnya, ia lebih mudah dan senang digunakan.

muat turun Muat turun GraphLib Dapatkan kod sumber untuk pustaka grafik Android sumber terbuka yang diperkenalkan dalam artikel ini. Dicipta oleh John I. Moore.

Gambaran keseluruhan GraphLib

GraphLibterdiri daripada satu antara muka dan lapan kelas. Tiga dari kelas tersebut adalah dalaman untuk perpustakaan dan hanya mempunyai akses pakej, jadi anda tidak perlu memahaminya untuk menggunakan GraphLib. Dua dari baki kelas mempunyai fungsi yang sangat sederhana, dan selebihnya tidak sukar untuk diambil.

Di bawah ini saya akan menerangkan antara muka GraphLib dan setiap lapan kelasnya. Perhatikan bahawa saya menggunakan ciri-ciri Java 8 seperti antara muka fungsional dan ekspresi lambda untuk mengembangkan dan menguji perpustakaan, tetapi agak mudah untuk mengubah ciri-ciri ini untuk versi Java sebelumnya.

Antara muka fungsi GraphLib

Seperti yang ditunjukkan dalam Penyenaraian 1, antara muka Functionhanya mempunyai satu kaedah abstrak dan, oleh itu, antara muka yang berfungsi. Perhatikan bahawa antara muka ini kira-kira setara dengan Java 8 DoubleUnaryOperator, terdapat dalam pakej java.util.function. Perbezaannya adalah Functiontidak menggunakan ciri Java 8 selain penjelasan @FunctionalInterface. Menghapus anotasi ini adalah satu-satunya perubahan yang diperlukan untuk menjadikan Functionantara muka serasi dengan versi Java yang lebih lama.

Penyenaraian 1. fungsi antara muka

 package com.softmoore.android.graphlib; @FunctionalInterface public interface Function { public double apply(double x); } 

Belajar mengenai ungkapan lambda

Ekspresi lambda, juga dikenal sebagai penutupan, literal fungsi, atau sekadar lambdas, menggambarkan sekumpulan ciri yang ditentukan dalam Permintaan Spesifikasi Java (JSR) 335. Pengenalan yang kurang formal terhadap ekspresi lambda disediakan di bahagian versi terbaru Tutorial Java; dalam artikel JavaWorld "Pemrograman Java dengan ekspresi lambda," dan dalam beberapa artikel oleh Brian Goetz, "State of the lambda" dan "State of the lambda: Libraries edition."

Kelas GraphLib

Kelas Pointdan Labelagak sederhana: Pointmerangkum sepasang nilai ganda yang mewakili titik dalam satah x, y , dan Labelmerangkumi nilai ganda dan rentetan, di mana nilai ganda mewakili titik pada paksi dan rentetan digunakan untuk melabelkan bahawa titik. Contoh dalam Rajah 1 menggunakan titik untuk menggambarkan graf garis dan label untuk sumbu di bahagian bawah, menunjukkan singkatan satu huruf selama bulan-bulan. Saya akan memberikan lebih banyak contoh yang menggambarkan penggunaan kelas-kelas ini kemudian dalam artikel.

Kelas GraphFunction, GraphPointsdan ScreenPointtidak hanya sangat sederhana, mereka juga dalaman untuk perpustakaan dan hanya mempunyai akses pakej. Anda tidak semestinya memahami kelas ini untuk menggunakan perpustakaan, jadi saya akan menerangkannya sebentar di sini:

  • GraphFunctionmerangkumi fungsi (iaitu, kelas yang melaksanakan antara muka Function) dan warna yang digunakan untuk menarik fungsi itu.
  • GraphPointsmerangkumi senarai titik berserta warna yang digunakan untuk memplotkannya. Kelas ini digunakan secara dalaman untuk kedua-dua titik plot dan melukis graf garis.
  • ScreenPointmerangkum sepasang nilai integer yang mewakili koordinat piksel pada skrin peranti Android. Kelas ini serupa dengan tetapi lebih sederhana daripada kelas Android Pointdalam pakej android.graphics.

Saya telah memberikan kod sumber untuk kelas ini sekiranya anda berminat dengan perinciannya.

Tiga baki kelas di perpustakaan GraphLib adalah Graph, Graph.Builder, dan GraphView. Penting untuk memahami peranan yang dimainkan oleh masing-masing dalam aplikasi Android.

Kelas Graphmengandungi maklumat mengenai warna, titik, label, grafik, dan lain-lain, yang akan dilukis, tetapi pada dasarnya tidak bergantung kepada perincian grafik Android. Walaupun Graphmempunyai banyak bidang, semuanya mempunyai nilai lalai, dan oleh itu masuk akal untuk menggunakan corak Builder untuk membuat contoh kelas ini. Kelas Graphmengandungi subkelas statik bersarang bernama Builder, yang digunakan untuk membuat Graphobjek.

Kedua-dua kelas Graphdan Graph.Builderbersama-sama, dari perspektif pemaju, dan harus difahami, pada dasarnya, sebagai satu. Sebenarnya, anda hanya perlu memahami cara menggunakan kelas bersarang Builderuntuk membuat Graphobjek. Pembangun tidak benar-benar melakukan apa-apa secara langsung dengan Graphobjek setelah dibuat selain menyerahkannya ke GraphViewobjek, yang berfungsi memaparkan segala sesuatu pada peranti Android.

Penyenaraian 2 merangkum kaedah yang terdapat di kelas Graph.Builder. Contoh kemudian akan menggambarkan cara menggunakan corak Builder untuk membuat Graphobjek. Buat masa ini, cukup untuk diperhatikan bahawa, selain konstruktor lalai (baris pertama dalam Penyenaraian 2) dan build()kaedah (baris terakhir dalam Penyenaraian 2), semua kaedah lain mengembalikan Builderobjek. Ini memungkinkan untuk membuat rangkaian panggilan ke kaedah pembangun.

Penyenaraian 2. Ringkasan kaedah di kelas Graph.Builder

 public Builder() public Builder addFunction(Function function, int graphColor) public Builder addFunction(Function function) public Builder addPoints(Point[] points, int pointColor) public Builder addPoints(List points, int pointColor) public Builder addPoints(Point[] points) public Builder addPoints(List points) public Builder addLineGraph(Point[] points, int lineGraphColor) public Builder addLineGraph(List points, int lineGraphColor) public Builder addLineGraph(Point[] points) public Builder addLineGraph(List points) public Builder setBackgroundColor(int bgColor) public Builder setAxesColor(int axesColor) public Builder setFunctionColor(int functColor) public Builder setPointColor(int pointColor) public Builder setWorldCoordinates(double xMin, double xMax, double yMin, double yMax) public Builder setAxes(double axisX, double axisY) public Builder setXTicks(double[] xTicks) public Builder setXTicks(List xTicks) public Builder setYTicks(double[] yTicks) public Builder setYTicks(List yTicks) public Builder setXLabels(Label[] xLabels) public Builder setXLabels(List xLabels) public Builder setYLabels(Label[] yLabels) public Builder setYLabels(List yLabels) public Graph build() 

Anda akan perhatikan dalam Penyenaraian 2 bahawa banyak kaedah yang berlebihan untuk menerima sama ada susunan objek atau senarai objek. Saya lebih mengutamakan array daripada senarai untuk contoh dalam artikel ini, hanya kerana lebih mudah untuk memulakan array, tetapi GraphLibmenyokong kedua-duanya. Walau bagaimanapun, Java 9 akan mengandungi kaedah kilang kemudahan untuk koleksi, sehingga menghilangkan kelebihan kecil ini untuk tatasusunan. Sekiranya Java 9 digunakan secara meluas pada masa artikel ini, saya lebih suka senarai daripada array dalam kedua GraphLib- dua contoh dan kemudiannya.

Corak Pembina

Untuk mengetahui lebih lanjut mengenai pola Builder, lihat edisi kedua Java Berkesan oleh Joshua Bloch atau artikel JavaWorld "Terlalu banyak parameter dalam kaedah Java, Bahagian 3: Corak pembangun" oleh Dustin Marx.

Kelas antara muka pengguna di Android disebut paparan , dan kelas Viewdalam pakej android.viewadalah blok asas untuk komponen antara muka pengguna. Pandangan menempati kawasan segi empat tepat di layar, dan bertanggungjawab untuk menggambar dan mengendalikan acara. Dari perspektif warisan, kelas Viewadalah kelas nenek moyang bukan sahaja kawalan antara muka pengguna (butang, medan teks, dll.) Tetapi juga susun atur, yang merupakan kumpulan pandangan yang tidak kelihatan yang terutama bertanggungjawab mengatur komponen anak mereka.

Kelas GraphViewmeluaskan kelas Viewdan bertanggungjawab untuk memaparkan maklumat yang dikemas dalam Graphpada peranti Android. Oleh itu, kelas GraphViewadalah tempat semua lukisan berlaku.

Menggunakan GraphLib

Ada dua pendekatan untuk membuat antara muka pengguna untuk Android: pendekatan prosedural (dalam kode sumber Java) atau pendekatan deklaratif (dalam file XML). Salah satu daripadanya sah, tetapi kata sepakat adalah menggunakan pendekatan deklaratif sebanyak mungkin. Saya telah menggunakan pendekatan deklaratif untuk contoh saya.

Terdapat lima langkah asas untuk menggunakan GraphLibperpustakaan. Sebelum anda memulakan, muat turun kod sumber Java yang disusun untuk pustaka GraphLib. 

muat turun Muat turun GraphLib.jar Dapatkan kod sumber Java yang disusun untuk GraphLib. Dicipta oleh John I. Moore.

Langkah 1. Sediakan graphlib.jar untuk projek Android anda

Create a new project using Android Studio and copy the JAR file graphlib.jar to the libs subdirectory of your project's app directory. In Android Studio, switch the folder structure from Android to Project. Next, in the libs folder (nested within the app folder), right-click on the JAR file and click on Add as library. This last action will add the JAR file in the dependencies section of your app's build.gradle file. See "How to add a jar in external libraries in Android Studio" if you need help with this step.

Step 2. Create an Android activity that will use GraphLib

In Android applications, an activity represents a single screen with a user interface. Activities are defined primarily in two files: an XML file that declares the UI layout and components, and a Java file that defines runtime functionality such as event handling. When a new project is created, Android Studio usually creates a default activity named MainActivity. Use this activity or create a new one for your application.

Step 3. Add a GraphView to the layout for the activity

In the XML file for the activity's layout, you will declare a GraphView object in much the same way that you declare a button or a text view, except that you need to provide the full package name for the GraphView. Listing 3 shows an excerpt from a layout file that declares a GraphView followed by a TextView as part of a vertical linear layout. Following recommended practice, the actual values for the width and height of the GraphView are defined in separate dimen resource files, where different resource files provide values for different screen sizes/densities. (Note: I used 325 for both values in the examples below.)

Listing 3. Declaring a GraphView and a TextView in a layout XML file

Step 4. Import the library classes into the activity

Listing 4 shows the list of import statements for an application if the library classes are imported individually. The list of imports can be abbreviated to a single line as import com.softmoore.android.graphlib.* if desired. Personally, I prefer to see the expanded list as shown in Listing 4.

Listing 4. Import the library classes

 import com.softmoore.android.graphlib.Function; import com.softmoore.android.graphlib.Graph; import com.softmoore.android.graphlib.GraphView; import com.softmoore.android.graphlib.Label; import com.softmoore.android.graphlib.Point; 

Step 5. Create a Graph object and add it to the GraphView

Listing 5 shows the creation of a simple graph object--in this case a graph object that uses all of the default values. It essentially contains only a set of x- and y-axes, where the values on both axes range from 0 to 10. The listing also sets a title for the screen and text for the text view below the graph.

Listing 5. Create a Graph object and add it to the GraphView

 Graph graph = new Graph.Builder() .build(); GraphView graphView = findViewById(R.id.graph_view); graphView.setGraph(graph); setTitle("Empty Graph"); TextView textView = findViewById(R.id.graph_view_label); textView.setText("Graph of Axes"); 

Gambar 2 menunjukkan hasil menjalankan aplikasi ini pada peranti Android.

John I. Moore

Menggunakan GraphLib dalam aplikasi Android

Untuk baki artikel ini saya akan menumpukan pada penggunaan dunia nyata dari pustaka GraphLib dalam pengembangan aplikasi Android. Saya akan mengemukakan tujuh contoh dengan penerangan ringkas dan petikan kod sumber. Perhatikan bahawa senarai kod Java untuk contoh ini difokuskan pada penggunaan Graph.Builderuntuk membuat Graphobjek yang sesuai . Panggilan ke findViewById(), setGraph(), setTitle(), dan lain-lain, akan menjadi sama seperti yang ditunjukkan di dalam Senarai 5 dan tidak termasuk dalam senarai kod.