2011-01-15 11 views
0

こんにちは私はいくつかの画像を表示するのに使うグリッドビューを持っています。 ユーザーが1つのレベルを終了したら、そのレベルの親指を変更したいと思います。 (何とかそれが完了したことを示す)。Android GridView - ビットマップを動的に変更するにはどうすればよいですか?

レベルごとに2つの親指を作成しました。 1つはオリジナルであり、1つはレベルが完了したことを示しています。

しかし、どのように画像のソースを変更できますか?

私が画像を描画するために使用するコードは、このように見えます。

主な活動:

/** 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); 
     } 
     } 
    }); 
} 

ImageAdapterクラス:

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 
}; 

}

答えて

1

あなたが親指を基にして新しいビットマップを作成し、使用してその上にあなたの余分なグラフィックスを描画できキャンバス。そして、あなたはimageView.setImageBitmap

[編集]私は今、私はちょっとあなたの質問を誤解参照

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]

よう

何かを使ってImageViewのにそのビットマップを渡すことができます。.. doh。レベル完全親指を動的に作成するのではなく、すでに親指を持っています。その場合、完成した親指を持つ別の配列を作成し、正しい配列からリソースを選択します。そして、配列に固執するには、次のようにレベルの補完を格納することもできます:

imageView.setImageResource((mLevelCompleted[position]) ? mThumbCompleteIds[position] : mThumbIds[position]); 
+0

もう少し正確になりますか?私が見ることができるサンプルコードがありますか?私はイメージの操作を行うためにCanvasを作成する必要がある理由を理解していませんか? – theAlse

+0

私はいくつかのコードで私の答えを更新します。ビットマップを操作するには、Canvasオブジェクトが必要です。 –

+0

答えをありがとう、私が家に帰るとすぐにしようとします。 – theAlse

0

私は同じ問題を抱えています。ここ は、私が何をすべきかです:

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. 

    } 


}) 
0

私はあなたがビットマップが表示されます以前に知っていたときに役に立つかもしれない汚いトリックを使用しています。

私はちょうど脇に見える互いに見えないImageViewを設定し、View.GONEは右の効果があるので

myImageView.setVisibility(n); // (n = 0 = View.VISIBLE) or (n = 8 = View.GONE) 

は、 4値定数 View.INVISIBLEを使用しないでください操ります。可視性が View.GONEに設定されている場合、オブジェクトはレイアウト内のスペースを取らない。これはCSSの display: none;に似ています。

関連する問題