Android Custom Gallery View, установить собственную границу - PullRequest
1 голос
/ 26 апреля 2011

Я реализовал GalleryView.Я хочу отобразить изображение границы на выбранном изображении из Галереи.

Gallery ga = (Gallery)findViewById(R.id.Gallery01);
    ga.setAdapter(new ImageAdapter(this));//, android.R.layout.simple_list_item_1, items));

    imageView = (ImageView)findViewById(R.id.ImageView01);
    ga.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapter, View view, int location,
                long arg3) {
            imageView.setImageResource(items.get(location));

            final ImageView iv = (ImageView) adapter.getSelectedView();
            iv.setBackgroundResource(R.drawable.large_button_sel_liner);
        }
    });

И мой класс адаптера

class ImageAdapter1 extends ArrayAdapter<Integer> {

    private Context ctx;
    private List<Integer> items;

    public ImageAdapter1(Context context, int textViewResourceId,
            List<Integer> objects) {
        super(context, textViewResourceId, objects);
        items = objects;
        ctx = context;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ImageView iv = new ImageView(ctx);
        iv.setImageResource(items.get(position));
        iv.setScaleType(ImageView.ScaleType.FIT_XY);
        iv.setLayoutParams(new Gallery.LayoutParams(150,120));

        return iv;
    }
}!

Он полностью растерт.enter image description here

Ответы [ 3 ]

5 голосов
/ 26 апреля 2011

У меня есть решение с использованием Selector.

Я создал galleryselector.xml

<?xml version="1.0" encoding="utf-8"?>  <selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item  android:state_selected="true" 
                    android:drawable="@drawable/large_button_sel_liner"/>
    <item android:drawable="@android:color/transparent" /></selector>

и установите его в классе адаптера в getView ():

imageView.setBackgroundDrawable(getResources().getDrawable(R.drawable.galleryselector));
4 голосов
/ 30 октября 2011

Вдохновленный ответом Нишанта Шана , я разработал собственное решение:

Прежде всего, создайте ресурс границы: common_galleryborder_shape.xml :

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners
        android:radius="2dp"
    />
    <solid
        android:color="@android:color/transparent"
    />
    <stroke
        android:width="2dp"
        android:color="@android:color/black"
   />
</shape>

Затем создайте селектор, который использует эту форму: common_gallerycurrentitem_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:state_selected="true"
        android:drawable="@drawable/common_galleryborder_shape"
    />
    <item
        android:drawable="@android:color/transparent"
    />
</selector>

И, наконец, добавьте этот код в свой класс адаптера:

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView imageView = new ImageView(mContext);

    Integer drawableId = items.get(position);
    Drawable drawable = ctx.getResources().getDrawable(drawableId);
    int width = drawable.getIntrinsicWidth();
    int height = drawable.getIntrinsicHeight();

    imageView.setImageResource(drawableId);
    //sets image size to same size of true image
    imageView.setLayoutParams(new Gallery.LayoutParams(width, height));
    imageView.setScaleType(ImageView.ScaleType.FIT_XY);
    //add a padding for the border
    int padding = dipToPx(mContext, 2);
    imageView.setPadding(padding, padding, padding, padding);
    imageView.setBackgroundResource(R.drawable.common_gallerycurrentitem_selector);

    return imageView;
}

// ----------------------------------------- Private Methods

/**
 * Convert a dimension in dip to px
 * @param context
 * @param dip
 * @return px
 */
private int dipToPx(Context context, int dip) {
    return (int) (dip * context.getResources().getDisplayMetrics().density);
}    

Кроме того, также возможно установить значение Gallery.setSpacing (int), чтобы избежать наложения изображений внутри галереи.

1 голос
/ 26 апреля 2011

В прошлом мне удавалось создать целое число, которое отслеживает выбор клика, а затем применить фон в методе getView (), если позиция соответствует выбору клика.Так (примерно):

Integer selectedLocation = null;

@Override
        public void onItemClick(AdapterView<?> adapter, View view, int location,
                long arg3) {
            selectedLocation = location;
        }

, а затем в представлении адаптера:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final ImageView iv = new ImageView(ctx);
    iv.setImageResource(items.get(position));
    iv.setScaleType(ImageView.ScaleType.FIT_XY);
    iv.setLayoutParams(new Gallery.LayoutParams(150,120));
    if(position == selectedLocation){
          iv.setBackgroundResource(R.drawable.large_button_sel_liner);
    }else{
          iv.setBackgroundResource(0);
    }

    return iv;
}

Возможно, вам придется проделать немного больше работы, чтобы отследить правильный выбор (местоположение щелчка иposition может не подходить для использования переменных), но в противном случае должно работать что-то похожее.

...