Saya bukan pengembang profesional, meskipun saya belajar sebagai programmer. Sekarang saya bekerja sebagai administrator sistem dan berencana untuk pindah ke pengembang. Saya menulis sendiri aplikasi yang mem-parsing salah satu situs web populer yang berhubungan dengan IT dan menampilkan artikel di aplikasi Android asli. Saya ingin semua gambar di artikel terbuka di galeri, seperti di aplikasi seluler habr.
Kemungkinan besar, manual ini akan menjadi sederhana, tetapi saya ingin mendapatkan umpan balik dan, kemungkinan besar, manual ini akan bermanfaat bagi seseorang.
Saya mencoba beberapa plugin. Beberapa tidak mulai, yang lain memerlukan jQuery, dan ini memperlambat pemuatan halaman dalam aplikasi. Pada akhirnya, saya memilih plugin PhotoSwipe. plugin tidak memerlukan jQuery, itu bekerja dengan cepat dan hampir tidak ada beratnya.
Pertama, Anda perlu memikirkan di mana dalam aplikasi itu lebih baik untuk menempatkan file sumber plugin. Pertama, dengan pengalaman, saya menempatkan file di folder mentah, tetapi lebih baik untuk menempatkannya di folder aset. Klik kanan pada aplikasi → baru → folder → Folder Aset
Markup akan menjadi satu WebView sederhana:
Kode<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <WebView android:id="@+id/webView" android:layout_width="match_parent" android:layout_height="match_parent"></WebView> </android.support.constraint.ConstraintLayout>
Selanjutnya, Anda perlu mengunduh atau mengkloning repositori dari PhotoSwipe (tautan di situs plugin) dan menyalin seluruh isi folder dist ke aset (dist dapat diubah namanya menjadi PhotoSwipe. Anda juga dapat membuat file style.css di folder css sehingga gambar menempati seluruh lebar.
img { width: 100%; height: auto; }
Untuk galeri Anda perlu menghubungkan gaya, file javascipt dan file gaya untuk kulit. Anda dapat menghasilkan html:
Di sinilah html untuk tampilan web pergi public String getHTML() { String header = "<!DOCTYPE HTML><HTML><head><title>test</title>";
.
Agar plugin berfungsi, Anda juga perlu memasukkan wadah untuk galeri ke sumber halaman. Dokumentasi mengatakan bahwa ini bukan plugin sederhana dan Anda perlu melakukan beberapa pekerjaan sendiri.
Dianjurkan untuk memasukkan kode sebelum tag penutup
Wadah Galeri public String getPhotoSwipeHTML() { return "<!-- Root element of PhotoSwipe. Must have class pswp. -->\n" + "<div class=\"pswp\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\">\n" + "\n" + " <!-- Background of PhotoSwipe. \n" + " It's a separate element as animating opacity is faster than rgba(). -->\n" + " <div class=\"pswp__bg\"></div>\n" + "\n" + " <!-- Slides wrapper with overflow:hidden. -->\n" + " <div class=\"pswp__scroll-wrap\">\n" + "\n" + " <!-- Container that holds slides. \n" + " PhotoSwipe keeps only 3 of them in the DOM to save memory.\n" + " Don't modify these 3 pswp__item elements, data is added later on. -->\n" + " <div class=\"pswp__container\">\n" + " <div class=\"pswp__item\"></div>\n" + " <div class=\"pswp__item\"></div>\n" + " <div class=\"pswp__item\"></div>\n" + " </div>\n" + "\n" + " <!-- Default (PhotoSwipeUI_Default) interface on top of sliding area. Can be changed. -->\n" + " <div class=\"pswp__ui pswp__ui--hidden\">\n" + "\n" + " <div class=\"pswp__top-bar\">\n" + "\n" + " <!-- Controls are self-explanatory. Order can be changed. -->\n" + "\n" + " <div class=\"pswp__counter\"></div>\n" + "\n" + " <button class=\"pswp__button pswp__button--close\" title=\"Close (Esc)\"></button>\n" + "\n" + " <button class=\"pswp__button pswp__button--share\" title=\"Share\"></button>\n" + "\n" + " <button class=\"pswp__button pswp__button--fs\" title=\"Toggle fullscreen\"></button>\n" + "\n" + " <button class=\"pswp__button pswp__button--zoom\" title=\"Zoom in/out\"></button>\n" + "\n" + " <!-- Preloader demo https://codepen.io/dimsemenov/pen/yyBWoR -->\n" + " <!-- element will get class pswp__preloader--active when preloader is running -->\n" + " <div class=\"pswp__preloader\">\n" + " <div class=\"pswp__preloader__icn\">\n" + " <div class=\"pswp__preloader__cut\">\n" + " <div class=\"pswp__preloader__donut\"></div>\n" + " </div>\n" + " </div>\n" + " </div>\n" + " </div>\n" + "\n" + " <div class=\"pswp__share-modal pswp__share-modal--hidden pswp__single-tap\">\n" + " <div class=\"pswp__share-tooltip\"></div> \n" + " </div>\n" + "\n" + " <button class=\"pswp__button pswp__button--arrow--left\" title=\"Previous (arrow left)\">\n" + " </button>\n" + "\n" + " <button class=\"pswp__button pswp__button--arrow--right\" title=\"Next (arrow right)\">\n" + " </button>\n" + "\n" + " <div class=\"pswp__caption\">\n" + " <div class=\"pswp__caption__center\"></div>\n" + " </div>\n" + "\n" + " </div>\n" + "\n" + " </div>\n" + "\n" + "</div>"; }
Dokumentasi memberikan contoh cara mengaktifkan plugin dengan mengklik gambar, tetapi perlu dicatat bahwa PhotoSwipe tidak peduli bagaimana tepatnya memulainya. Akibatnya, saya menulis naskah saya. Saya menunjukkan artikel dari situs orang lain di aplikasi, jadi saya mendapatkan html siap pakai. Agar tidak bekerja secara dinamis dengan tata letak, dalam skrip saya, saya mengubah kelas untuk semua gambar (karena pasti tidak ada yang berlebihan dalam artikel), menetapkan event handler (ketika diklik, url dilewatkan - berfungsi sebagai pengidentifikasi untuk galeri, dan plugin mulai).
Plugin perlu mengetahui ukuran gambar. Karena galeri terhubung saat seluruh halaman dimuat, mudah untuk mengetahui ukuran akhir gambar melalui properti NaturalWidth dan naturalHeight dari gambar.
Kode skrip Pertama, ketika halaman dimuat, fungsi init () dimulai; Lalu, ketika Anda mengklik gambar openGallery ().
Selanjutnya, Anda perlu mengkonfigurasi WebView dan memuat halaman.
webView = findViewById(R.id.webView); webView.setWebViewClient(new WebViewClient()); webView.setWebChromeClient(new WebChromeClient()); webView.getSettings().setJavaScriptEnabled(true); webView.getSettings().setDomStorageEnabled(true);
Pada tahap ini, halaman dimuat, plugin dimulai ketika Anda mengklik gambar, tetapi ketika Anda menekan tombol kembali dengan galeri terbuka, seluruh aplikasi ditutup, bukan plugin.
Untuk mengatasinya, saya membuat jembatan Javascipt.
Pertama, Anda perlu membuat singleton dengan keadaan galeri.
Kode package me.denko.photoswipe; class GalleryState { private static final GalleryState ourInstance = new GalleryState(); static GalleryState getInstance() { return ourInstance; } private GalleryState() { } private boolean isGallery = false; public boolean isGallery() { return isGallery; } public void setGallery(boolean gallery) { isGallery = gallery; } }
Antarmuka lebih lanjut untuk panggilan dari WebView
Kode package me.denko.photoswipe; import android.webkit.JavascriptInterface; public class JavascriptFromWebView { @JavascriptInterface public static void setGallery(boolean bool) { GalleryState.getInstance().setGallery(bool); } }
Anda perlu menghubungkan antarmuka ini ke WebView
webView.addJavascriptInterface(new JavascriptFromWebView(), "callAndroid");
Dalam skrip untuk membuka galeri yang perlu Anda tambahkan
callAndroid.setGallery(true);
Galeri menutup skrip dalam file photoswipe.js
Kode close: function() { if(!_isOpen) { return; } callAndroid.setGallery(false);
Sekarang ketika Anda membuka galeri, negara diatur ke true, ketika ditutup, false. Yang tersisa adalah menambahkan clicker tombol tampilan web.
Kode webView.setOnKeyListener(new View.OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { if (event.getAction() != KeyEvent.ACTION_DOWN && keyCode == KeyEvent.KEYCODE_BACK) { if (GalleryState.getInstance().isGallery()) { webView.reload(); GalleryState.getInstance().setGallery(false); } else onBackPressed(); } return true; } });
Sekarang galeri bisa dibuka lalu ditutup dengan tombol kembali.
Kode aplikasi
github lengkap.
Kritik terhadap kode ini disambut baik. Jika saya melakukan sesuatu yang salah, silakan tulis di komentar.