瘋狂連連看之載入介面的圖片
正如前面AbstractBoard類的程式碼中看到的,當程式需要建立N個Piece物件時,程式會直接呼叫ImageUtil的getPlayImages()方法去獲取圖片,該方法將會隨機從res\drawable-mdpi目錄下取得N張圖片。
為了讓getPlayImages()方法從res\drawable-mdpi目錄下隨機取得N張圖片,程式的實現思路可分為如下幾步:
透過反射來獲取R.drawable的所有Field(Android的每張圖片資源都會自動轉換為R.drawable的靜態Field),並將這些Field值新增到一個List集合中。
從第一步得到的List集合中隨機“抽取”N/2個圖片ID。
將第二步得到的N/2個圖片ID全部複製一份,這樣就得到了N個圖片ID,而且每個圖片ID都可以找到與之配對的。
將第三步得到的N個圖片ID再次“隨機打亂”,並根據圖片ID載入相應的Bitmap物件,最後把圖片ID及對應的Bitmap封裝成PieceImage後返回。
下面是ImageUtil類的程式碼。
程式清單:codes\18\Link\src\org\crazyit\link\util\ImageUtil.java
public class ImageUtil
{
// 儲存所有連連看圖片資源值(int型別)
private static List
//獲取連連看所有圖片的ID(約定所有圖片ID以p_開頭)
public static List
{
try
{
// 得到R.drawable所有的屬性, 即獲取drawable目錄下的所有圖片
Field[] drawableFields = R.drawable.class.getFields();
List
for (Field field : drawableFields)
{
// 如果該Field的名稱以p_開頭
if (field.getName().indexOf("p_") != -1)
{
resourceValues.add(field.getInt(R.drawable.class));
}
}
return resourceValues;
}
catch (Exception e)
{
return null;
}
}
/**
* 隨機從sourceValues的集合中獲取size個圖片ID, 返回結果為圖片ID的集合
* @param sourceValues 從中獲取的集合
* @param size 需要獲取的個數
* @return size個圖片ID的集合
*/
public static List
int size)
{
// 建立一個隨機數生成器
Random random = new Random();
// 建立結果集合
List
for (int i = 0; i < size; i++)
{
try
{
// 隨機獲取一個數字,大於、小於sourceValues.size()的數值
int index = random.nextInt(sourceValues.size());
// 從圖片ID集合中獲取該圖片物件
Integer image = sourceValues.get(index);
// 新增到結果集中
result.add(image);
}
catch (IndexOutOfBoundsException e)
{
return result;
}
}
return result;
}
/**
* 從drawable目錄中獲取size個圖片資源ID, 其中size為遊戲數量
* @param size 需要獲取的圖片ID的數量
* @return size個圖片ID的集合
*/
public static List
{
if (size % 2 != 0)
{
// 如果該數除以2有餘數,將size加1
size += 1;
}
// 再從所有的圖片值中隨機獲取size的一半數量
List
// 將playImageValues集合的元素增加一倍(保證所有圖片都有與之配對的圖片)
playImageValues.addAll(playImageValues);
// 將所有圖片ID隨機“洗牌”
Collections.shuffle(playImageValues);
return playImageValues;
}
/**
* 將圖片ID集合轉換PieceImage物件集合,PieceImage封裝了圖片ID與圖片本身
* @param context
* @param resourceValues
* @return size個PieceImage物件的集合
*/
public static List
{
// 獲取圖片ID組成的集合
List
List
// 遍歷每個圖片ID
for (Integer value : resourceValues)
{
// 載入圖片
Bitmap bm = BitmapFactory.decodeResource(
context.getResources(), value);
// 封裝圖片ID與圖片本身
PieceImage pieceImage = new PieceImage(bm, value);
result.add(pieceImage);
}
return result;
}
// 獲取選中標識的圖片
public static Bitmap getSelectImage(Context context)
{
Bitmap bm = BitmapFactory.decodeResource(context.getResources(),
R.drawable.selected);
return bm;
}
}
本文節選自《瘋狂Android講義(含CD光碟1張)》一書。
圖書詳細資訊:http://space.itpub.net/?uid-13164110-action-viewspace-itemid-702318
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-702324/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 瘋狂連連看之開發遊戲介面元件開發遊戲元件
- 瘋狂Spring Cloud連載(1)Spring Cloud概述SpringCloud
- 瘋狂的比特幣–資訊圖比特幣
- javascript圖片預載入詳細介紹JavaScript
- javascript圖片預載入簡單介紹JavaScript
- 瘋狂的 Vue3 之 SetupVue
- 學習連連看 連線線之謎+道具的使用
- HTML 連結和圖片HTML
- 前端優化之圖片懶載入前端優化
- 小程式之背景圖片的載入
- 豆瓣:2013年瘋狂電影大資料之看電影大資料
- 前端如何通過連結去下載img圖片前端
- Android ImageLoader框架之圖片載入與載入策略Android框架
- Flutter 圖片載入Flutter
- 圖片懶載入
- 預載入圖片
- 圖片載入事件事件
- 載入圖片方式
- Android 基礎之圖片載入(二)Android
- ListView 之非同步載入圖片亂序View非同步
- 《瘋狂的動物》專案詳情介紹
- 圖片預載入和懶載入
- 連連看演算法演算法
- 面向切面程式設計之瘋狂的 Aspects程式設計
- 騰訊“瘋狂”開源!
- 網易瘋狂佇列佇列
- 瘋狂學習——DP!
- 京東正在瘋狂招人。。。
- 圖片懶載入(IntersectionObserver)Server
- 圖片懶載入原理
- 委託載入圖片
- 載入遠端圖片
- Android常用圖片載入庫介紹及對比Android
- jquery實現的圖片預載入簡單介紹jQuery
- 載入本地圖片模糊,Glide載入網路圖片卻很清晰地圖IDE
- 圖之強連通、強連通圖、強連通分量 Tarjan演算法演算法
- 結對專案-連連看
- 《天天連連看》隱私策略