Статьи

Создание галерейной сетки изображений с помощью родного Android

Ранее я написал статью о том, как создать сетку изображений в  виде галереи с помощью Ionic Framework , но что если мы захотим сделать то же самое с помощью собственного Android SDK?

В этом уроке мы увидим, как использовать Android  GridView  с адаптером изображений для отображения удаленных изображений из Интернета.

Как и во всех моих уроках, мы будем использовать только терминал и текстовый редактор. Так что нет IDE, таких как Android Studio или Eclipse. Из командной строки или терминала запустите следующее:

android create project --activity MainActivity --package com.nraboy.imagegrid --path ./ImageGrid --target android-19 --gradle --gradle 0.11.+

В приведенной выше команде вы заметите, что мы создаем наш проект с намерением использовать  Gradle  вместо  Apache Ant .

Давайте начнем с простых вещей в первую очередь. В вашем недавно созданном проекте откройте файл src / res / AndroidManifest.xml и добавьте интернет-разрешение следующим образом:

<uses-permission android:name="android.permission.INTERNET" />

Мы делаем это, потому что мы будем отображать изображения непосредственно из Интернета.

Собственная сетка изображений Android

Выше приведено изображение того, что нам нужно для этого примера.

Когда дело доходит до разработки этого приложения, давайте начнем с XML-кода представления Android. Откройте файл вашего проекта sssrc / res / layout / main.xml и добавьте его, заменив его следующим кодом:

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/gridview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:columnWidth="115dp"
    android:numColumns="auto_fit"
    android:verticalSpacing="5dp"
    android:horizontalSpacing="5dp"
    android:stretchMode="columnWidth"
    android:gravity="center" />

Мы создаем Android,  GridView где каждый столбец сетки будет иметь  115dp размер и  5dp x 5dp интервал.

А  GridView в Android заполняется с помощью какой-либо формы адаптера. В этом случае мы будем создавать наш собственный адаптер. Создайте файл src / main / java / com / nraboy / imagegrid / ImageAdapter.java и добавьте следующий код:

package com.nraboy.imagegrid;

import android.app.*;
import android.os.*;
import android.widget.*;
import java.util.*;
import android.graphics.*;
import android.view.*;
import android.content.*;

public class ImageAdapter extends BaseAdapter {

    private Context context;
    private ArrayList<Bitmap> bitmapList;

    public ImageAdapter(Context context, ArrayList<Bitmap> bitmapList) {
        this.context = context;
        this.bitmapList = bitmapList;
    }

    public int getCount() {
        return this.bitmapList.size();
    }

    public Object getItem(int position) {
        return null;
    }

    public long getItemId(int position) {
        return 0;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView imageView;
        if (convertView == null) {
            imageView = new ImageView(this.context);
            imageView.setLayoutParams(new GridView.LayoutParams(115, 115));
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
        } else {
            imageView = (ImageView) convertView;
        }

        imageView.setImageBitmap(this.bitmapList.get(position));
        return imageView;
    }

}

В приведенном выше коде , мы, по существу , принимая  ArrayList из  Bitmap и назначая содержание в любой данный индекс к определенной ячейке в сетке. Нам повезло, что  getView функция определяет текущий вид и позицию. Вид, являющийся клеткой.

Это приводит нас к  MainActivity классу, который мы создали при сборке нашего проекта из командной строки. Мы собираемся захватить сетку из нашего XML и заполнить ее изображениями по нашему выбору. Откройте файл src / main / java / com / nraboy / imagegrid / MainActivity.java и добавьте следующий код:

package com.nraboy.imagegrid;

import android.app.Activity;
import android.os.Bundle;
import android.graphics.*;
import java.util.*;
import java.net.*;
import android.widget.*;

public class MainActivity extends Activity {

    private GridView imageGrid;
    private ArrayList<Bitmap> bitmapList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        this.imageGrid = (GridView) findViewById(R.id.gridview);
        this.bitmapList = new ArrayList<Bitmap>();

        this.imageGrid.setAdapter(new ImageAdapter(this, this.bitmapList));

    }

}

Подожди секунду! Как мы собираемся получить наши изображения там? Мы назначаем наш пользовательский адаптер для сетки, но в нем нет изображений  ArrayList. В этом конкретном примере мы собираемся загружать наши изображения непосредственно из Интернета. Вы можете загружать растровые изображения по своему усмотрению.

private Bitmap urlImageToBitmap(String imageUrl) throws Exception {
    Bitmap result = null;
    URL url = new URL(imageUrl);
    if(url != null) {
        result = BitmapFactory.decodeStream(url.openConnection().getInputStream());
    }
    return result;
}

Вышеприведенная функция берет удаленное изображение из URL и загружает его как растровое изображение. Итак, все вместе в нашем  MainActivity классе, у нас есть следующее:

package com.nraboy.imagegrid;

import android.app.Activity;
import android.os.Bundle;
import android.graphics.*;
import java.util.*;
import java.net.*;
import android.widget.*;

public class MainActivity extends Activity {

    private GridView imageGrid;
    private ArrayList<Bitmap> bitmapList;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        this.imageGrid = (GridView) findViewById(R.id.gridview);
        this.bitmapList = new ArrayList<Bitmap>();

        try {
            for(int i = 0; i < 10; i++) {
                this.bitmapList.add(urlImageToBitmap("http://placehold.it/150x150"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        this.imageGrid.setAdapter(new ImageAdapter(this, this.bitmapList));

    }

    private Bitmap urlImageToBitmap(String imageUrl) throws Exception {
        Bitmap result = null;
        URL url = new URL(imageUrl);
        if(url != null) {
            result = BitmapFactory.decodeStream(url.openConnection().getInputStream());
        }
        return result;
    }

}

Я выбрал просто загрузить десять общих изображений заполнителей в приведенном выше коде.

Чтобы построить это, в своем терминале или командной строке выполните следующую команду Gradle:

./gradlew assemble

У вас должен быть файл ImageGrid-debug.apk, созданный в каталоге build / output / apk.

Вывод

Создать сетку изображений с помощью родного Android не так уж и сложно. Если вы не отставали от моих руководств, то теперь вы видели собственный метод Android, а также  гибридный метод с Ionic Framework . Мы заполнили нашу сетку изображений, используя удаленные изображения из Интернета, загруженные в растровую форму.