CardGame
新建項目CardGame
一直下一步完成創建工程。
首先新建一個drawable文件夾,將55張撲克牌放入文件夾中。
而後新建一個工具包:
創建一個工具類:Tools(在Tools中提供一些公共的靜態方法供外部調用)
創建玩Tools工具類後,需要在string.xml中定義每一張撲克牌的名稱:
<stringname="p_1">大王</string> <stringname="p_2">小王</string> <stringname="p_b1">背面</string>
<stringname="p_x_1">紅心A</string> <stringname="p_x_2">紅心2</string> <stringname="p_x_3">紅心3</string> <stringname="p_x_4">紅心4</string> <stringname="p_x_5">紅心5</string> <stringname="p_x_6">紅心6</string> <stringname="p_x_7">紅心7</string> <stringname="p_x_8">紅心8</string> <stringname="p_x_9">紅心9</string> <stringname="p_x_10">紅心10</string> <stringname="p_x_J">紅心J</string> <stringname="p_x_Q">紅心Q</string> <stringname="p_x_K">紅心K</string>
<stringname="p_f_1">方塊A</string> <stringname="p_f_2">方塊2</string> <stringname="p_f_3">方塊3</string> <stringname="p_f_4">方塊4</string> <stringname="p_f_5">方塊5</string> <stringname="p_f_6">方塊6</string> <stringname="p_f_7">方塊7</string> <stringname="p_f_8">方塊8</string> <stringname="p_f_9">方塊9</string> <stringname="p_f_10">方塊10</string> <stringname="p_f_J">方塊J</string> <stringname="p_f_Q">方塊Q</string> <stringname="p_f_K">方塊K</string>
<stringname="p_h_1">黑桃A</string> <stringname="p_h_2">黑桃2</string> <stringname="p_h_3">黑桃3</string> <stringname="p_h_4">黑桃4</string> <stringname="p_h_5">黑桃5</string> <stringname="p_h_6">黑桃6</string> <stringname="p_h_7">黑桃7</string> <stringname="p_h_8">黑桃8</string> <stringname="p_h_9">黑桃9</string> <stringname="p_h_10">黑桃10</string> <stringname="p_h_J">黑桃J</string> <stringname="p_h_Q">黑桃Q</string> <stringname="p_h_K">黑桃K</string>
<stringname="p_m_1">梅花A</string> <stringname="p_m_2">梅花2</string> <stringname="p_m_3">梅花3</string> <stringname="p_m_4">梅花4</string> <stringname="p_m_5">梅花5</string> <stringname="p_m_6">梅花6</string> <stringname="p_m_7">梅花7</string> <stringname="p_m_8">梅花8</string> <stringname="p_m_9">梅花9</string> <stringname="p_m_10">梅花10</string> <stringname="p_m_J">梅花J</string> <stringname="p_m_Q">梅花Q</string> <stringname="p_m_K">梅花K</string> |
首先在Tools類中創建一個方法public static StringgetCardName(Context mContext, String fileName),將文件名(圖片的名稱)傳入,返回我們可以認得的撲克牌(string.xml中定義的撲克牌名稱)。
public static String getCardName(Context mContext, String fileName) { Context context = mContext.getApplicationContext(); String result = "null"; switch (fileName) { case "p_1": // 大王 result = context.getString(R.string.p_1); break; case "p_2": // 小王 result = context.getString(R.string.p_2); break; case "p_x_1": // 紅心A result = context.getString(R.string.p_x_1); break; case "p_x_2": // 紅心2 result = context.getString(R.string.p_x_2); break; case "p_x_3": // 紅心3 result = context.getString(R.string.p_x_3); break; case "p_x_4": // 紅心4 result = context.getString(R.string.p_x_4); break; case "p_x_5": // 紅心5 result = context.getString(R.string.p_x_5); break; case "p_x_6": // 紅心6 result = context.getString(R.string.p_x_6); break; case "p_x_7": // 紅心7 result = context.getString(R.string.p_x_7); break; case "p_x_8": // 紅心8 result = context.getString(R.string.p_x_8); break; case "p_x_9": // 紅心9 result = context.getString(R.string.p_x_9); break; case "p_x_10": // 紅心10 result = context.getString(R.string.p_x_10); break; case "p_x_11": // 紅心J result = context.getString(R.string.p_x_J); break; case "p_x_12": // 紅心Q result = context.getString(R.string.p_x_Q); break; case "p_x_13": // 紅心K result = context.getString(R.string.p_x_K); break;
case "p_h_1": // 黑桃A result = context.getString(R.string.p_h_1); break; case "p_h_2": // 黑桃2 result = context.getString(R.string.p_h_2); break; case "p_h_3": // 黑桃3 result = context.getString(R.string.p_h_3); break; case "p_h_4": // 黑桃4 result = context.getString(R.string.p_h_4); break; case "p_h_5": // 黑桃5 result = context.getString(R.string.p_h_5); break; case "p_h_6": // 黑桃6 result = context.getString(R.string.p_h_6); break; case "p_h_7": // 黑桃7 result = context.getString(R.string.p_h_7); break; case "p_h_8": // 黑桃8 result = context.getString(R.string.p_h_8); break; case "p_h_9": // 黑桃9 result = context.getString(R.string.p_h_9); break; case "p_h_10": // 黑桃10 result = context.getString(R.string.p_h_10); break; case "p_h_11": // 黑桃J result = context.getString(R.string.p_h_J); break; case "p_h_12": // 黑桃Q result = context.getString(R.string.p_h_Q); break; case "p_h_13": // 黑桃K result = context.getString(R.string.p_h_K); break;
case "p_m_1": // 梅花A result = context.getString(R.string.p_m_1); break; case "p_m_2": // 梅花2 result = context.getString(R.string.p_m_2); break; case "p_m_3": // 梅花3 result = context.getString(R.string.p_m_3); break; case "p_m_4": // 梅花4 result = context.getString(R.string.p_m_4); break; case "p_m_5": // 梅花5 result = context.getString(R.string.p_m_5); break; case "p_m_6": // 梅花6 result = context.getString(R.string.p_m_6); break; case "p_m_7": // 梅花7 result = context.getString(R.string.p_m_7); break; case "p_m_8": // 梅花8 result = context.getString(R.string.p_m_8); break; case "p_m_9": // 梅花9 result = context.getString(R.string.p_m_9); break; case "p_m_10": // 梅花10 result = context.getString(R.string.p_m_10); break; case "p_m_11": // 梅花J result = context.getString(R.string.p_m_J); break; case "p_m_12": // 梅花Q result = context.getString(R.string.p_m_Q); break; case "p_m_13": // 梅花K result = context.getString(R.string.p_m_K); break;
case "p_f_1": // 方塊A result = context.getString(R.string.p_f_1); break; case "p_f_2": // 方塊2 result = context.getString(R.string.p_f_2); break; case "p_f_3": // 方塊3 result = context.getString(R.string.p_f_3); break; case "p_f_4": // 方塊4 result = context.getString(R.string.p_f_4); break; case "p_f_5": // 方塊5 result = context.getString(R.string.p_f_5); break; case "p_f_6": // 方塊6 result = context.getString(R.string.p_f_6); break; case "p_f_7": // 方塊7 result = context.getString(R.string.p_f_7); break; case "p_f_8": // 方塊8 result = context.getString(R.string.p_f_8); break; case "p_f_9": // 方塊9 result = context.getString(R.string.p_f_9); break; case "p_f_10": // 方塊10 result = context.getString(R.string.p_f_10); break; case "p_f_11": // 方塊J result = context.getString(R.string.p_f_J); break; case "p_f_12": // 方塊Q result = context.getString(R.string.p_f_Q); break; case "p_f_13": // 方塊K result = context.getString(R.string.p_f_K); break; default: result = "error"; break; } return result; } |
而後在Tools繼續添加一個通過id查找fileName的方法:
publicstaticString getFileNameById(Context mContext,int id)
public static String getFileNameById(Context mContext, int id) { Context context = mContext.getApplicationContext(); String result = context.getResources().getResourceEntryName(id); return result; } |
而後在Tools繼續添加一個通過fileName查找id的方法:
publicstaticintgetIdByFileName(Context mContext, String fileName)
public static int getIdByFileName(Context mContext, String fileName) { Context context = mContext.getApplicationContext(); int result = context.getResources().getIdentifier(fileName, "drawable", mContext.getPackageName()); return result; } |
接下來就是MainActivity的佈局文件activity_main.xml,這裏將根佈局設置爲LinearLayout,並添加一個Button。
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFFCC" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin">
<Button android:id="@+id/single_card_mode" style="@android:style/Widget.Button.Inset" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="onClick" android:text="@string/single_card"/>
</LinearLayout> |
之後在MainActivity類中刪除不必要的代碼,並添加一個onClick(View view)方法
package lyx.feng.cardgame;
import android.app.Activity; import android.os.Bundle; import android.view.View;
public class MainActivity extends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }
public void onClick(View view) { switch (view.getId()) { case R.id.single_card_mode:
break; } } }
|
之後創建一個繼承Activity的SingleCardModeActivity類,並添加布局文件:singlecardmode.xml
首先在singlecardmode.xml佈局文件中添加一個Spinner、Button、ImageView這3個組件。
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFFCC" android:orientation="vertical">
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal">
<Spinner android:id="@+id/singlecardmode_spinner" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1"/>
<Button android:id="@+id/singlecardmode_btn" style="@android:style/Widget.Button.Inset" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_margin="10dp" android:layout_weight="1" android:text="@string/showresult"/> </LinearLayout>
<ImageView android:id="@+id/singlecardmode_imageview" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="12dp" android:gravity="center_horizontal" android:src="@drawable/p_b1"/>
</LinearLayout> |
佈局都比較簡單,上面一個水平方向的LinearLayout,裏面包裹的是Spinner和一個Button,下面則直接顯示一個ImageView。
接着就是SingleCardModeActivity這個類。
import lyx.feng.cardgame.R; import android.app.Activity; import android.os.Bundle;
public class SingleCardModeActivityextends Activity {
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.singlecardmode); } }
|
在MainActivity類的onClick()方法中添加跳轉的操作
public void onClick(View view) { switch (view.getId()) { case R.id.single_card_mode: startActivity(new Intent(this, SingleCardModeActivity.class)); break; } } |
並在AndroidManifest.xml文件註冊SingleCardModeActivity。
<activityandroid:name=".SingleCardModeActivity"/> |
接下來運行程序:
主界面:
點擊單張猜牌按鈕:
接下來就是修改SingleCardModeActivity代碼:
這裏首先獲取singlecardmodeactivity.xml佈局的Spinner、Button、ImageView這3個組件。
package lyx.feng.cardgame; ...... public class SingleCardModeActivity extends Activity { private ImageViewimageView = null; private Spinnerspinner = null; private Buttonbtn = null;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.setContentView(R.layout.singlecardmode);
init(); }
private void init() {
this.imageView = (ImageView)super .findViewById(R.id.singlecardmode_imageview); this.spinner = (Spinner)super .findViewById(R.id.singlecardmode_spinner); this.btn = (Button)super.findViewById(R.id.singlecardmode_btn); } }
|
接下來爲Spinner初始化操作:在操作之前,先在strings.xml文件中添加一個數組,裏面保存的是撲克牌的集合。
<string-arrayname="allCards"> <item>大王</item> <item>小王</item> <item>紅桃A</item> <item>紅桃1</item> <item>紅桃2</item> <item>紅桃3</item> <item>紅桃4</item> <item>紅桃5</item> <item>紅桃6</item> <item>紅桃7</item> <item>紅桃8</item> <item>紅桃9</item> <item>紅桃10</item> <item>紅桃J</item> <item>紅桃Q</item> <item>紅桃K</item>
<item>黑桃A</item> <item>黑桃1</item> <item>黑桃2</item> <item>黑桃3</item> <item>黑桃4</item> <item>黑桃5</item> <item>黑桃6</item> <item>黑桃7</item> <item>黑桃8</item> <item>黑桃9</item> <item>黑桃10</item> <item>黑桃J</item> <item>黑桃Q</item> <item>黑桃K</item>
<item>方塊A</item> <item>方塊1</item> <item>方塊2</item> <item>方塊3</item> <item>方塊4</item> <item>方塊5</item> <item>方塊6</item> <item>方塊7</item> <item>方塊8</item> <item>方塊9</item> <item>方塊10</item> <item>方塊J</item> <item>方塊Q</item> <item>方塊K</item>
<item>梅花A</item> <item>梅花1</item> <item>梅花2</item> <item>梅花3</item> <item>梅花4</item> <item>梅花5</item> <item>梅花6</item> <item>梅花7</item> <item>梅花8</item> <item>梅花9</item> <item>梅花10</item> <item>梅花J</item> <item>梅花Q</item> <item>梅花K</item> </string-array> |
而後是Spinner的初始化:
String allCards[] = getResources().getStringArray(R.array.allCards); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_spinner_dropdown_item, allCards); this.spinner.setAdapter(adapter); this.spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override public void onItemSelected(AdapterView<?> parent, View view, int position,long id) { imageView.setImageResource(R.drawable.cardbackground); }
@Override public void onNothingSelected(AdapterView<?> parent) { // TODO Auto-generated method stub
} }); |
效果:
而後是在54張牌中隨機獲取一張牌設置到ImageView中去。這裏添加一個getRandomCard()方法隨機獲取一張撲克牌,返回一個id。
public int getRandomCard() { List<Integer> list = Tools.getAllCards("p_"); int id = list.get(new Random().nextInt(list.size())); return id; } |
Tools.getAllCards方法返回所有撲克牌的集合。
public static List<Integer> getAllCards(String startWith) { List<Integer> list = new ArrayList<Integer>(); Field fields[] = R.drawable.class.getDeclaredFields(); for (int i = 0; i < fields.length; i++) { if (fields[i].getName().startsWith(startWith)) { try { list.add(fields[i].getInt(R.drawable.class)); } catch (Exception e) { e.printStackTrace(); } } } return list; } |
接着就是SingleCardModeActivity類的Button按鈕操作。
this.btn.setOnClickListener(new OnClickListener() {
@Override public void onClick(View v) {
// 隨機獲取的一張撲克牌Id int randomCard = getRandomCard(); // Spinner選擇的內容 String temp = spinner.getSelectedItem().toString(); // Spinner選擇的位置 intselectItem = spinner.getSelectedItemPosition(); // 顯示的卡片名稱 String selectCardName = Tools.getCardName( SingleCardModeActivity.this, Tools.getFileNameById( SingleCardModeActivity.this, randomCard));
imageView.setImageResource(randomCard); if (temp.equals(selectCardName)) { Toast.makeText(SingleCardModeActivity.this,"猜對了", Toast.LENGTH_SHORT).show(); } else { Toast.makeText(SingleCardModeActivity.this, "你選擇的是:" + temp +"\n顯示的是:" + selectCardName, Toast.LENGTH_SHORT).show(); } } }); |
在Button按鈕獲取了選擇的卡片和顯示的卡片,然後對比顯示對應的Toast提示內容。
在SingleCardModeActivity類新建2個Animation,一個顯示ImageView進來的動畫,一個顯示ImageView出去的動畫
public Animation getAlphaAnimation() { AlphaAnimation alpha = new AlphaAnimation(0.0f, 1.0f); alpha.setDuration(500); return alpha; }
public Animation getInTransAnimation() { int
height = getWindowManager().getDefaultDisplay(). int width = getWindowManager().getDefaultDisplay(). TranslateAnimation trans = new TranslateAnimation(width, 0, 0, 0); trans.setDuration(500); return trans; } |
而後在相應的位置設置即可。
最後效果: