2011-04-26 121 views
1

我已经实现了GalleryView。我想在图库中的选定图像上显示边框图像。Android自定义图库视图,设置自己的边框

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

回答

4

我已经得到了使用Selector的解决方案。

我在getView()创建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> 

,并设置在适配器类:

imageView.setBackgroundDrawable(getResources().getDrawable(R.drawable.galleryselector)); 
1

发生了什么,我在过去的工作是创建跟踪点击选择一个整数,然后应用在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; 
} 

您可能需要做一些更多的工作轨道向右选择(点击位置和位置可能不使用正确的变量),但其他类似的东西应该可以工作。

3

通过Nishant Shan's reply启发,我阐述自己的解决方案:

第一总之,创建一个边框资源: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)值以避免图库内部的图像重叠。