Android GridView - Comment changer une image bitmap dynamique?
-
11-10-2019 - |
Question
Bonjour j'ai un GRIDVIEW que j'utilise pour montrer quelques photos sur (petit pouce de niveaux diffrent). Lorsque l'utilisateur se termine un niveau, je voudrais changer le pouce pour ce niveau. (Montrer une certaine façon qu'il a terminé).
J'ai créé deux pouces pour chaque niveau. L'un est l'original et qui montre que le niveau est terminé.
Mais comment puis-je changer la source des images?
Le code que j'utilise pour dessiner les images ressemble à ceci.
L'activité principale:
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.maps);
GridView gridview = (GridView) findViewById(R.id.gridview);
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
//Open the map which was clicked on, if there is one
if(position+1 > 1){
Toast.makeText(maps.this, "Level " + (position+1) + " is not yet available!", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(maps.this, "Opening Level " + (position+1), Toast.LENGTH_SHORT).show();
Intent myIntent = new Intent(v.getContext(), Tutorial2D.class);
startActivity(myIntent);
}
}
});
}
La ImageAdapter Classe:
public class ImageAdapter extends BaseAdapter {
private Context mContext;
public ImageAdapter(Context c) {
mContext = c;
}
public int getCount() {
return mThumbIds.length;
}
public Object getItem(int position) {
return null;
}
public long getItemId(int position) {
return 0;
}
// create a new ImageView for each item referenced by the Adapter
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
//Changing
imageView.setImageResource(mThumbIds[position]);
return imageView;
}
// references to our images
private Integer[] mThumbIds = {
R.drawable.map1, R.drawable.map2, R.drawable.map3,
R.drawable.map4, R.drawable.map5, R.drawable.map6,
R.drawable.map7, R.drawable.map8, R.drawable.map9,
R.drawable.map10, R.drawable.map11, R.drawable.map12,
R.drawable.map13, R.drawable.map14, R.drawable.map15,
R.drawable.map16, R.drawable.map17, R.drawable.map18,
R.drawable.map19
};
}
La solution
Vous pouvez créer une nouvelle image à base de pouce et d'en tirer vos graphiques supplémentaires sur l'aide d'une toile. Ensuite, vous pouvez passer ce bitmap à l'aide de imageview imageView.setImageBitmap
[modifier]
quelque chose comme
public View getView(int position, View convertView, ViewGroup parent) {
ImageView imageView;
if (convertView == null) { // if it's not recycled, initialize some attributes
imageView = new ImageView(mContext);
imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
imageView.setPadding(8, 8, 8, 8);
} else {
imageView = (ImageView) convertView;
}
if (mLevelfinished) {
//create thumbnail bitmap
mThumbBmp = BitmapFactory.decodeResource(mResources, mThumbIds[position]);
//draw a check over the bitmap
Canvas c = new Canvas(mThumbBmp);
c.drawBitmap(mCheckBitmap, destX, destY, null);
imageView.setImageBitmap(mThumbBmp);
} else {
imageView.setImageResource(mThumbIds[position]);
}
return imageView;
}
[Edit2]
Je vois maintenant je un peu mal compris votre question .. doh. Au lieu de créer le pouce complet niveau dynamique, vous avez déjà les pouces pour ceux-ci. Dans ce cas, je voudrais créer un autre tableau qui a les pouces remplis et choisissez la ressource à partir du tableau correct. Et pour coller avec les tableaux, peut-être stocker l'achèvement de niveau dans un aussi:
imageView.setImageResource((mLevelCompleted[position]) ? mThumbCompleteIds[position] : mThumbIds[position]);
Autres conseils
Je suis le même problème. Voici ce que je fais:
gridview.setAdapter(new ImageAdapter(this));
gridview.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
Toast.makeText(Punch.this, "" + mThumbIds[position], Toast.LENGTH_SHORT).show();
mThumbIds[position]=R.drawable.crabx;//crabxImg;
//here is where I would like to redraw the whole grid but it will not let me.
//Because ImageAdapter is not defined within this callback.
}
})
J'utilise un truc sale qui pourrait être utile lorsque vous savez déjà ce que bitmaps sera affiché.
Je mis en place une autre ImageView
invisible juste de côté le visible, et manipuler
myImageView.setVisibility(n); // (n = 0 = View.VISIBLE) or (n = 8 = View.GONE)
Ne pas utiliser la View.INVISIBLE
constante qui valorise 4
, car View.GONE
est l'effet escompté. Lorsque la visibilité est définie sur View.GONE
, l'objet ne prendra pas l'espace dans la mise en page. Ceci est similaire à display: none;
de CSS.