Android SDK: Menampilkan gambar dengan galeri ditingkatkan
Indonesian (Bahasa Indonesia) translation by Taufan Prasetyo Basri (you can also view the original English article)
Menggunakan Android maksud dan tampilan Galeri, Anda dapat membolehkan pengguna untuk memilih gambar dari perangkat mereka. Dalam tutorial ini kita akan menggabungkan gambar pilihan pengguna dengan tampilan Galeri, yang kami akan meningkatkan sedikit untuk membuat sebuah layar interaktif menampilkan pengguna yang dipilih gambar. Jika Anda telah menyelesaikan setidaknya satu aplikasi Android, Anda harus mampu melaksanakan langkah-langkah dalam tutorial.
App yang kita akan membangun dalam tutorial ini akan menampilkan daftar bergulir gambar thumbnail, menggunakan tampilan Galeri Android. Pengguna akan dapat mengimpor gambar untuk menampilkan dengan panjang-menekan item dalam galeri, di mana mereka akan dibawa ke default Galeri Android aplikasi atau manajer file pilihan mereka. Ketika gambar yang dipilih kembali ke aplikasi, kita akan resample itu sebelum layar, sehingga kami tidak menggunakan sumber daya memori yang tidak perlu. Pada menekan sebuah pratayang gambar, app akan menampilkan gambar yang dipilih pada ukuran yang lebih besar.
Langkah 1: Buat sebuah proyek Android
Memulai sebuah proyek baru Android di Eclipse. Di kelas Aktivitas utama aplikasi Anda, tambahkan pernyataan impor berikut di bagian atas, sebelum garis deklarasi kelas pembuka:
import android.app.Activity; import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import android.view.View; import android.view.ViewGroup; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.AdapterView.OnItemLongClickListener; import android.widget.BaseAdapter; import android.widget.Gallery; import android.widget.ImageView;
Deklarasi kelas Anda harus memulai sesuatu seperti ini, tetapi dengan nama Kegiatan Anda sendiri:
public class PicSelectActivity extends Activity {
Di dalam deklarasi kelas, sebelum metode "onCreate", yang Eclipse seharusnya secara otomatis dimasukkan, tambahkan Deklarasi variabel contoh ini:
//variable for selection intent private final int PICKER = 1; //variable to store the currently selected image private int currentPic = 0; //gallery object private Gallery picGallery; //image view for larger display private ImageView picView;
Variabel pertama, yang konstan, adalah untuk mengidentifikasi gambar chooser maksud ketika gambar pilihan pengguna kembali ke aplikasi. Ketika pengguna menekan lama suatu item thumbnail dan dikeluarkan dari aplikasi untuk memilih gambar, kami akan menggunakan variabel 'currentPic' untuk melacak thumbnail yang mereka pilih untuk gambar. Dua variabel lainnya adalah untuk item antarmuka pengguna yang perlu kami rujuk di kelas.
Dalam manifest file, penambahan hanya Anda perlu adalah sebagai berikut, ditambahkan ke aplikasi Anda unsur aktivitas utama:
android:configChanges="orientation|keyboardHidden"
Ini akan memungkinkan aplikasi untuk mempertahankan Impor gambar pada orientasi perubahan. Sekarang mari kita setup teks string kita ingin menggunakan dalam antarmuka pengguna. Buka file "res/values/strings.xml". Gerhana harus telah menambahkan nama aplikasi sudah, yang Anda dapat mengubah jika Anda inginkan. Mencakup unsur-unsur String tambahan berikut:
<string name="picture">Picture</string> <string name="select_intro">Long-press a thumbnail to add an image</string> <string name="show_intro">Press a thumbnail to display at larger size</string>
Ini semua untuk digunakan dalam antarmuka pengguna. Sekarang kembali ke aplikasi Anda aktivitas kelas.
Langkah 2: Desain aplikasi
Sebelum kita menerapkan fungsi aplikasi di Jawa, mari kita menyelesaikan elemen desain. Buka "res/layout/main.xml" file. Kita akan menggunakan tata letak linier, jadi mencakup garis besar berikut dalam XML utama Anda:
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > </LinearLayout>
Kami akan menambahkan unsur-unsur lain dalam tata letak Linear. Memulai dengan pandangan teks yang informatif sebagai item pertama dalam tata letak linier:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:padding="5dp" android:text="@string/select_intro" android:gravity="center" android:textStyle="bold" />
Perhatikan bahwa kita merujuk pada sebuah String yang kita didefinisikan dalam file XML string. Selanjutnya tambahkan elemen Galeri sebagai berikut:
<Gallery android:id="@+id/gallery" android:layout_width="fill_parent" android:layout_height="wrap_content" />
Kami menggunakan atribut ID sehingga kita dapat merujuk ke galeri dalam kode Jawa. Selanjutnya tambahkan pandangan lain informatif teks:
<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center" android:padding="5dp" android:textStyle="italic" android:text="@string/show_intro" />
Sekali lagi, kami menggunakan sumber daya string yang sudah didefinisikan. Akhirnya, item terakhir dalam Linear Layout kami akan menjadi Tampilan Gambar untuk menampilkan satu gambar Galeri pada ukuran yang lebih besar:
<ImageView android:id="@+id/picture" android:layout_width="fill_parent" android:layout_height="fill_parent" android:contentDescription="@string/picture" />
Kita perlu mengacu pada Tampilan ini di Java, jadi kami menggunakan atribut ID. Kami juga menggunakan sumber daya string sebagai deskripsi konten. Sekarang kita perlu mendefinisikan beberapa atribut gaya untuk Galeri. Buat file baru di direktori 'res / values' Anda, beri nama 'attrs.xml'. Masukkan kode berikut:
<resources> <declare-styleable name="PicGallery"> <attr name="android:galleryItemBackground" /> </declare-styleable> </resources>
Kami akan menggunakan beberapa sumber daya gaya platform Android untuk menata item Galeri kami, dan akan merujuk ini di kode Java.
Sekarang kembali ke kelas Activity Anda. Di dalam metode "onCreate", kode yang ada harus muncul sebagai berikut:
super.onCreate(savedInstanceState); setContentView(R.layout.main);
Setelah baris tersebut, tambahkan berikut, mengambil referensi ke dua item antarmuka pengguna:
//get the large image view picView = (ImageView) findViewById(R.id.picture); //get the gallery view picGallery = (Gallery) findViewById(R.id.gallery);
Sekarang kita siap untuk membangun Galeri dan menangani interaksi pengguna.
Langkah 3: Buat Base Adapter
Untuk membangun Tampilan Galeri, kita akan membuat kelas yang memperluas kelas Adaptor Dasar. Di kelas Activity Anda, setelah metode 'onCreate', buat garis besar kelas baru sebagai berikut:
public class PicAdapter extends BaseAdapter { }
Dalam hal ini kami akan memberikan beberapa metode yang diperlukan oleh adaptor dasar dan kemudian akan menambahkan beberapa metode kustom untuk aplikasi ini. Pertama, di dalam kelas baru, menambahkan beberapa contoh variabel:
//use the default gallery background image int defaultItemBackground; //gallery context private Context galleryContext; //array to store bitmaps to display private Bitmap[] imageBitmaps; //placeholder bitmap for empty spaces in gallery Bitmap placeholder;
Variabel pertama mewakili Android Galeri item latar belakang kami dirujuk dalam kami "attrs.xml" file. Konteksnya adalah untuk merujuk ke antarmuka pengguna saat menambahkan elemen. Array Bitmap akan menyimpan bitmap yang akan kita tampilkan sebagai bagian dari Tampilan Galeri. Untuk mulai dengan, kita akan menggunakan gambar placeholder, untuk item Galeri pengguna belum memilih gambar untuk belum.
Mari kita pergi ke depan dan menciptakan metode konstruktor untuk kami baru PicAdapter kelas, setelah variabel instan:
public PicAdapter(Context c) { //instantiate context galleryContext = c; //create bitmap array imageBitmaps = new Bitmap[10]; //decode the placeholder image placeholder = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); //more processing }
Kami akan menambahkan lebih banyak kode ke metode konstruktor selanjutnya. Di sini kita pertama instantiate variabel array konteks dan Bitmap - kita akan menampilkan sebuah galeri dengan 10 item di dalamnya tetapi Anda dapat mengubah ini jika Anda suka. Untuk demonstrasi, kami menggunakan ikon pelancar yang disediakan sebagai standar ketika Anda membuat sebuah proyek Android di Eclipse sebagai gambar pengganti kami, tetapi Anda dapat tentu saja membuat Anda sendiri. Jika Anda ingin menggunakan gambar Anda sendiri, simpanlah ke folder yang dapat digambar dan ubah baris 'decodeResource' di kode di atas untuk mencerminkan namanya.
Sekarang kami dapat menetapkan gambar pengganti untuk setiap posisi dalam array, sehingga semua thumbnail Galeri awalnya akan menampilkan-masih di dalam metode pembuat:
//set placeholder as all thumbnail images in the gallery initially for(int i=0; i<imageBitmaps.length; i++) imageBitmaps[i]=placeholder;
Untuk menyelesaikan metode konstruktor, kita sekarang mengatur gambar latar belakang Galeri item:
//get the styling attributes - use default Andorid system resources TypedArray styleAttrs = galleryContext.obtainStyledAttributes(R.styleable.PicGallery); //get the background resource defaultItemBackground = styleAttrs.getResourceId( R.styleable.PicGallery_android_galleryItemBackground, 0); //recycle attributes styleAttrs.recycle();
Di sini kita merujuk pada isi dari kami "attrs.xml" file.
Sekarang kita perlu menyediakan beberapa metode standar untuk setiap kelas yang memperluas kelas Base Adapter. Pertama termasuk metode 'getCount', setelah metode konstruktor:
//return number of data items i.e. bitmap images public int getCount() { return imageBitmaps.length; }
Metode ini mengembalikan jumlah item dalam Tampilan Galeri. Setelah metode ini, tambahkan metode 'getItem' standar:
//return item at specified position public Object getItem(int position) { return position; }
Selanjutnya tambahkan metode "getItemId":
//return item ID at specified position public long getItemId(int position) { return position; }
Anda tidak perlu khawatir terlalu banyak tentang isi dari metode ini karena mereka standar. Sekarang kami menambahkan metode yang sedikit lebih rumit yang dibutuhkan oleh kelas:
//get view specifies layout and display options for each thumbnail in the gallery public View getView(int position, View convertView, ViewGroup parent) { //create the view ImageView imageView = new ImageView(galleryContext); //specify the bitmap at this position in the array imageView.setImageBitmap(imageBitmaps[position]); //set layout options imageView.setLayoutParams(new Gallery.LayoutParams(300, 200)); //scale type within view area imageView.setScaleType(ImageView.ScaleType.FIT_CENTER); //set default gallery item background imageView.setBackgroundResource(defaultItemBackground); //return the view return imageView; }
Dalam metode "getView", kita mendefinisikan apa yang kita ingin muncul dalam setiap Galeri item. Kami array Bitmap akan memuat gambar yang kita ingin menampilkan di setiap posisi, dengan indeks array Bitmap yang sesuai dengan posisi dalam galeri. Juga menciptakan tampilan, di sini kami mengatur Bitmap muncul di dalamnya, bersama-sama dengan beberapa properti tampilan. Kami juga mengatur latar belakang item kami dirujuk sebelumnya. Anda dapat mengubah ukuran thumbnail jika Anda suka. Setiap gambar thumbnail akan tampak terpusat jika lebih kecil dari item Lihat - Anda dapat memilih, misalnya, untuk meregangkan gambar agar sesuai dengan thumnbail jika Anda suka, dengan mengubah 'ScaleType'.
Sekarang gulir ke bagian atas deklarasi kelas Aktivitas utama aplikasi Anda. Tambahkan sebuah variabel instance baru yang mewakili instance objek kelas baru yang baru saja dibuat:
//adapter for gallery view private PicAdapter imgAdapt;
Sekarang, dalam metode "onCreate", setelah kode Anda sudah ditambahkan, instantiate variabel Adapter dasar Anda dan mengaturnya sebagai adaptor untuk Galeri:
//create a new adapter imgAdapt = new PicAdapter(this); //set the gallery adapter picGallery.setAdapter(imgAdapt);
Ketika aplikasi awalnya diluncurkan, aplikasi akan terlihat seperti ini:



Sekarang kami siap menangani interaksi pengguna.
Langkah 4: Memungkinkan pengguna untuk memilih gambar
Untuk memilih gambar yang akan ditampilkan di Galeri, pengguna akan menekan lama masing-masing item thumbnail. Dalam metode "onCreate" Anda, setelah kode yang sudah ada, menambahkan pendengar panjang-tekan berikut untuk setiap item dalam tampilan Galeri:
//set long click listener for each gallery thumbnail item picGallery.setOnItemLongClickListener(new OnItemLongClickListener() { //handle long clicks public boolean onItemLongClick(AdapterView<?> parent, View v, int position, long id) { //take user to choose an image } });
Di sini kita menciptakan baru "OnItemLongClickListener" dengan metode "onItemLongClick" di dalamnya. Di dalam metode ini, tambahkan kode berikut:
//update the currently selected position so that we assign the imported bitmap to correct item currentPic = position; //take the user to their chosen image selection app (gallery or file manager) Intent pickIntent = new Intent(); pickIntent.setType("image/*"); pickIntent.setAction(Intent.ACTION_GET_CONTENT); //we will handle the returned data in onActivityResult startActivityForResult(Intent.createChooser(pickIntent, "Select Picture"), PICKER); return true;
Luangkan waktu sejenak untuk melihat kode ini. Pertama, kami merekam item yang dipilih saat ini sehingga kami tahu item Galeri mana yang dipilih untuk gambar baru. Kemudian kode memberitahu aplikasi untuk membawa pengguna ke aplikasi pemilihan gambar pilihan mereka, yang mungkin merupakan galeri gambar Android atau aplikasi pengelola file. Dengan menentukan 'ACTION_GET_CONTENT', kami menginstruksikan aplikasi untuk mengembalikan apa pun yang dipilih pengguna. Karena kita mulai chooser maksud menggunakan "startActivityForResult", kita akan mampu menangani gambar kembali dalam kegiatan "onActivityResult" metode.
Apa yang terjadi ketika chooser gambar maksud mulai akan tergantung pada aplikasi yang user telah terinstal. Di perangkat saya, saya dapat memilih di antara dua aplikasi untuk pemilihan gambar:



File gambar mana saja yang saya pilih di salah satu aplikasi ini akan dikembalikan ke aplikasi kami.
Langkah 5: Menangani Gambar yang Dikembalikan
Ketika pengguna memilih gambar dari mereka galeri atau file manager aplikasi, data akan kembali ke "onActivityResult" metode. Tambahkan metode kelas aktivitas Anda menggunakan garis besar berikut:
protected void onActivityResult(int requestCode, int resultCode, Intent data) { } /java] Inside the method, add the following: [java] if (resultCode == RESULT_OK) { //check if we are returning from picture selection if (requestCode == PICKER) { //import the image } } //superclass method super.onActivityResult(requestCode, resultCode, data);
Di sini kami memeriksa bahwa kami telah menerima data yang valid dan bahwa data telah kembali dari Intent pemilihan gambar. Kami memanggil metode superclass di bagian akhir badan metode. Dalam pernyataan "jika" yang kedua, kita akan menambahkan semua kode kita perlu mengimpor pengguna pilihan gambar, dimulai dengan gambar URI:
//the returned picture URI Uri pickedUri = data.getData();
Kita perlu melakukan sedikit lebih banyak pekerjaan untuk mengimpor gambar. Mulai dengan menyatakan beberapa variabel penolong:
//declare the bitmap Bitmap pic = null; //declare the path string String imgPath = "";
Mari kita sekarang mencoba untuk mengambil jalan gambar:
//retrieve the string using media data String[] medData = { MediaStore.Images.Media.DATA }; //query the data Cursor picCursor = managedQuery(pickedUri, medData, null, null, null); if(picCursor!=null) { //get the path string int index = picCursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); picCursor.moveToFirst(); imgPath = picCursor.getString(index); } else imgPath = pickedUri.getPath();
Di sini kita mengambil gambar media data, kemudian permintaan menggunakan kursor, melewati URI untuk gambar yang dipilih oleh pengguna. "Jika" dan "lain" pernyataan mengakomodasi pengguna memilih citra mereka menggunakan apl Android galeri atau manajer file lain. Hasil akhir dari kode ini adalah kita memiliki jalur ke gambar yang dipilih.
Langkah 6: Tampilkan Gambar Sampel untuk Meminimalkan Penggunaan Memori
Daripada sekadar membaca gambar yang dipilih pengguna, kita perlu meminimalkan jumlah memori yang digunakan aplikasi. Dalam banyak kasus, gambar pada perangkat akan jauh lebih besar daripada apa yang kita dapat menampilkan dalam app. Untuk alasan ini, kami ingin resample setiap gambar sebelum membaca ke aplikasi ini. Masih di dalam pernyataan 'if' kedua di 'onActivityResult', tambahkan yang berikut:
//if we have a new URI attempt to decode the image bitmap if(pickedUri!=null) { }
Di dalam pernyataan ini kami akan mengulang dan mengimpor gambar. Mulailah dengan menetapkan lebar dan tinggi target untuk gambar Anda, yang seharusnya merupakan ukuran terbesar yang Anda inginkan untuk setiap gambar:
//set the width and height we want to use as maximum display int targetWidth = 600; int targetHeight = 400;
Sekarang kita perlu sebuah objek Bitmap pilihan untuk menangani decoding gambar:
//create bitmap options to calculate and use sample size BitmapFactory.Options bmpOptions = new BitmapFactory.Options();
Pertama kita ingin mengetahui tentang ukuran gambar:
//first decode image dimensions only - not the image bitmap itself bmpOptions.inJustDecodeBounds = true; BitmapFactory.decodeFile(imgPath, bmpOptions); //image width and height before sampling int currHeight = bmpOptions.outHeight; int currWidth = bmpOptions.outWidth;
Kita mengatakan Bitmap pilihan untuk men-decode dimensi gambar, tidak Bitmap itu sendiri. Kita akan menggunakan informasi ini untuk bekerja di luar ukuran sampel yang baik untuk mengimpor gambar di, mulai dengan inisialisasi variabel untuk menyimpannya:
//variable to store new sample size int sampleSize = 1;
Sekarang menghitung ukuran sample, jika target ukuran lebih kecil daripada ukuran default gambar:
//calculate the sample size if the existing size is larger than target size if (currHeight>targetHeight || currWidth>targetWidth) { //use either width or height if (currWidth>currHeight) sampleSize = Math.round((float)currHeight/(float)targetHeight); else sampleSize = Math.round((float)currWidth/(float)targetWidth); }
Sekarang kita dapat mengatur ukuran sampel Bitmap:
//use the new sample size bmpOptions.inSampleSize = sampleSize;
Sekarang kita perlu mengubah pengaturan Bitmap pilihan untuk men-decode konten file itu sendiri, daripada hanya dimensi:
//now decode the bitmap using sample options bmpOptions.inJustDecodeBounds = false;
Akhirnya kita dapat memecahkan kode Bitmap menggunakan pilihan yang kami pilih:
//get the file as a bitmap pic = BitmapFactory.decodeFile(imgPath, bmpOptions);
Variabel 'pic' sekarang memegang gambar Bitmap yang ingin kita gunakan dalam aplikasi.
Langkah 7: Menambahkan pilihan gambar ke Galeri
Sekarang bahwa kita memiliki gambar yang dipilih pengguna diimpor, kita dapat menambahkannya ke array galeri. Kita perlu menambahkan metode kustom kelas dasar Adapter kami untuk melakukan hal ini. Di dalam deklarasi kelas dalam 'PicAdapter' Anda, tambahkan metode berikut setelah metode 'getView':
//helper method to add a bitmap to the gallery when the user chooses one public void addPic(Bitmap newPic) { //set at currently selected index imageBitmaps[currentPic] = newPic; }
Sekarang kembali ke metode 'onActivityResult' Anda, setelah baris di mana Anda memecahkan kode file gambar, menyimpannya dalam variabel 'pic', tambahkan yang berikut:
//pass bitmap to ImageAdapter to add to array imgAdapt.addPic(pic); //redraw the gallery thumbnails to reflect the new addition picGallery.setAdapter(imgAdapt);
Pertama kita memanggil metode baru untuk menambahkan gambar baru ke susunan Galeri, kemudian kita mengatur Adaptor lagi sehingga gambar baru akan langsung muncul dalam Tampilan Galeri.
Langkah 8: Menampilkan satu gambar pada ukuran yang lebih besar
Akhirnya, kami ingin menampilkan satu gambar pada ukuran yang lebih besar. Sebuah gambar akan muncul di Tampilan Gambar yang lebih besar ketika awalnya diimpor ke dalam aplikasi dan ketika pengguna memilihnya dari thumbnail Galeri. Pertama, mari kita menangani menampilkan gambar pada ukuran yang lebih besar ketika pengguna awalnya impor itu. Dalam metode "onActivityResult" Anda, setelah baris di mana Anda disebut "setAdapter", tambahkan berikut:
//display the newly selected image at larger size picView.setImageBitmap(pic); //scale options picView.setScaleType(ImageView.ScaleType.FIT_CENTER);
Kami memiliki variabel instance yang mewakili tampilan gambar yang lebih besar, sehingga hanya dapat mengaturnya dengan skala pilihan. Sekarang mari kita menangani menampilkan gambar yang lebih besar ketika pengguna mengklik thumbnail. Di kelas 'PicAdapter' Anda, tambahkan metode kustom lain setelah metode 'addPic':
//return bitmap at specified position for larger display public Bitmap getPic(int posn) { //return bitmap at posn index return imageBitmaps[posn]; }
Metode ini hanya mengembalikan gambar di posisi tertentu. Sekarang pergi ke metode "onCreate" aktivitas Anda. Setelah pendengar tekan lama yang Anda tambahkan, sertakan hal-hal berikut, terapkan pendengar klik untuk setiap item dalam Tampilan Galeri:
//set the click listener for each item in the thumbnail gallery picGallery.setOnItemClickListener(new OnItemClickListener() { //handle clicks public void onItemClick(AdapterView<?> parent, View v, int position, long id) { //set the larger image view to display the chosen bitmap calling method of adapter class picView.setImageBitmap(imgAdapt.getPic(position)); } });
Metode "onItemClick" akan api setiap saat pengguna mengklik item di galeri. Kita memanggil metode "getPic" yang baru kami menambahkan kelas "PicAdapter" untuk kembali Bitmap pada posisi diklik, pengaturan ini sebagai tampilan gambar Bitmap untuk menampilkannya pada ukuran yang lebih besar.
Kesimpulan
Itulah kami apl galeri gambar lengkap. Mengujinya pada perangkat yang sebenarnya, mengimpor gambar oleh long-menekan thumbnail dan menekan masing-masing thumbnail pada gilirannya untuk menampilkannya pada ukuran yang lebih besar. Ketika pengguna telah memilih beberapa gambar, app akan muncul sesuatu seperti ini:



Tentu saja, Anda dapat meningkatkan aplikasi sesuai dengan kebutuhan Anda sendiri, misalnya untuk memberikan gambar tambahan interaksi. Kode sumber disediakan untuk referensi, jadi Anda memastikan Anda memiliki semua elemen yang digabungkan dengan benar.
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Update me weekly