公司培训了编码规范,回头过来看看我以前写过的代码,着实比较烂,缺少必要的注释,以及对于变量名的定义也不甚规范,故借着此次学习,我重新整理下一篇安卓项目的文章,规范下代码,可以用doxygen生成html文件,以便方便别人阅读源码以及以后自己回顾自己的成果,并且希望能够慢慢培养成规范的习惯。

源文章的地址是:http://blog.csdn.net/jjzhoujun2010/article/details/7976858

整个项目的主要思想和步骤是:

1.个性化安装图标的定制。

2.进入程序,播放背景音乐。

3.进行拼图游戏。

4.游戏过关后进入下一个界面,有两个按钮,点击即可实现给指定号码拨号功能。

由于源码我注释得也比较清楚了,直接上源码给大家看吧~

第一个界面的实现代码,Main.java

/***  @file Main.java*  @brief 整个程序的功能:实现一个手机拼图程序,并且带有自动拨号功能*  *  整个项目的主要思想和步骤是:*  1.个性化安装图标的定制。*  2.进入程序,播放背景音乐。*  3.进行拼图游戏。*  4.游戏过关后进入下一个界面,有两个按钮,点击即可实现给指定号码拨号功能。*  Blog: http://blog.csdn.net/jjzhoujun2010*  *  @author zhoujun*  @version V1.0.00*  @date 2012/09/12*/package com.example.zhangbeta2;import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Gravity;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;/*** @brief 实现一个手机拼图程序,并且带有自动拨号功能* */
public class Main extends Activity {private Intent mIntent = new Intent("com.angel.Android.MUSIC");Button mButtonNext = null;Button mButtonExit = null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);startService(mIntent);  //开启背景音乐mButtonNext = (Button)findViewById(R.id.buttonNext);mButtonNext.setOnClickListener(new NextButtonListener());mButtonExit = (Button)findViewById(R.id.buttonExit);mButtonExit.setOnClickListener(new ExitButtonListener());            }/*** @brief 本类功能:设置下一步按钮监听器,点击按钮跳转到相应拼图游戏的Activity中*/class NextButtonListener implements OnClickListener{@Overridepublic void onClick(View v) {// TODO Auto-generated method stub// 点击相应按钮,跳转到拼图界面activityIntent intent = new Intent();intent.setClass(Main.this, SePintu.class);startActivity(intent);    }       }/*** @brief 本类功能:设置退出按钮监听器,点击按钮弹出Toast,关闭背景音乐,并且退出整个程序*/class ExitButtonListener implements OnClickListener{private Toast toast;@Overridepublic void onClick(View v) {// TODO Auto-generated method stubtoast = Toast.makeText(getApplicationContext(), "无论如何,都希望你快乐幸福", Toast.LENGTH_LONG);toast.setGravity(Gravity.CENTER, 0, 0);LinearLayout toastView = (LinearLayout)toast.getView();ImageView imageCodeProject = new ImageView(getApplicationContext());imageCodeProject.setImageResource(R.drawable.pic3);toastView.addView(imageCodeProject, 0);toast.show();finish();stopService(mIntent);  //关闭背景音乐
//          android.os.Process.killProcess(android.os.Process.myPid());}        }@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);return true;}
}

跳转到第二个界面的实现代码,SePintu.java

/*** @file SePintu.java* @brief 显示拼图游戏界面,此图片是被打乱了的拼图* @author zhoujun* @version V1.0.00* @date 2012/09/12* Blog: http://blog.csdn.net/jjzhoujun2010*/package com.example.zhangbeta2;import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.Button;
import android.widget.LinearLayout;
/*** @brief 显示拼图游戏界面,此图片是被打乱了的拼图 * */
public class SePintu extends Activity{private int mLevelNow = 4;private ImageView mImages[][]; //存放小图片的数组private Bitmap mBitmap;           //资源图片private int mImageWidth = 0, mImageHeight = 0;  //slot的宽高private int mImageNum[];       //图片的顺序private int mX = 0, mY = 0;        //图片的起始位置private int mClickNum = 0;        //点击参数private int mWindowWidth = 0, mWindowHeight = 0;    //屏幕参数@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);
//      pic1 = (ImageView)findViewById(R.id.pic1);mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic1);System.out.println("width = " + mBitmap.getWidth() + "height = " + mBitmap.getHeight());//屏幕参数WindowManager w = this.getWindowManager();mWindowHeight = w.getDefaultDisplay().getHeight();mWindowWidth = w.getDefaultDisplay().getWidth();System.out.println("wWidth = " + mWindowWidth + "wHeight = " + mWindowHeight);       setImage();}/*** @brief 将一副图片分割成几个小部分打乱*/public void setImage() {mImageWidth = mBitmap.getWidth() / mLevelNow;        //切割图片,每一小块的宽度mImageHeight = mBitmap.getHeight() / mLevelNow;mImageNum = new int[mLevelNow * mLevelNow];System.out.println("mIWidth = " + mImageWidth + "mImageHeight = " + mImageHeight);erraLen(mLevelNow * mLevelNow); //随机组合切碎的小图片readyImage();setLayout();   //布局随机组合后的图片}/*** @brief 在当前的Activity中显示打乱后的拼图以及相应按钮* */private void setLayout() {PictureLayout lay = new PictureLayout(this, mImages);   //利用带参数的构造函数来布局小图片lay.setOrientation(LinearLayout.VERTICAL);lay.setGravity(Gravity.CENTER_HORIZONTAL);setContentView(lay);      //显示lay布局,SePintu的ActivityButton methodButton  = new Button(this);  methodButton.setText(R.string.method_btn_label); methodButton.setOnClickListener(new MethodBtnClick()); //添加监听器Button showSourceImageBtn = new Button(this);showSourceImageBtn.setText(R.string.show_source_image_btn_label);showSourceImageBtn.setOnClickListener(new SourceBtnClick());LinearLayout linear = new LinearLayout(this);  //注意,对于LinearLayout布局来说,设置横向还是纵向是必须的!否则就看不到效果了。  linear.setOrientation(LinearLayout.HORIZONTAL);  //此处相当于布局文件中的Android:gravity属性  linear.setGravity(Gravity.CENTER_HORIZONTAL); methodButton.setWidth(200);showSourceImageBtn.setWidth(200);linear.addView(methodButton);         //通过addView将两按钮添加到布局中linear.addView(showSourceImageBtn);lay.addView(linear);            //把linear当作子child添加到lay布局中}/*** @brief 点击“游戏说明”按钮,跳转到相应的Activity中* */class MethodBtnClick implements OnClickListener{@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent();intent.setClass(SePintu.this, Method.class);startActivity(intent);      //跳转Activity}        }/*** @brief 点击“查看原图”按钮,显示出未打乱的原图* */class SourceBtnClick implements OnClickListener{@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent(SePintu.this, SourceImageAty.class);startActivity(intent);       //跳转Activity}}/*** @brief 把一个有序数组通过随机取数打乱* @param lenght 数组大小,随机数的范围*/public void erraLen(int lenght) {int errInt[] = new int[lenght];for (int i = 0; i < lenght; i++) {errInt[i] = i;}int len = lenght;// 设置随机数的范围for (int i = 0; i < lenght; i++) {int index = (int) Math.floor((Math.random() * len));mImageNum[i] = errInt[index];for (int j = index; j < errInt.length - 1; j++) {// 把选中的数之后的数一次向前移一位,因为index选中的数已经存放在相应的mImageNum里面了,errInt[j] = errInt[j + 1];}len--;// 随机数的范围减一}}/*** @brief 准备图片 把一张图片截成几张小的通过打乱的数组来取cache里的图片放到View里面就成打乱二维数组*/private void readyImage() {Matrix matrix = new Matrix();mImages = new ImageView[mLevelNow][mLevelNow];// 设置缩放比例
//      float scaleW = ((float) mBitmap.getWidth()) / mBitmap.getWidth();
//      float scaleH = ((float) mBitmap.getHeight()) / mBitmap.getHeight();float scaleW = ((float) mBitmap.getWidth()) / (mWindowWidth + 180);float scaleH = ((float) mBitmap.getHeight()) / (mWindowHeight + 180);System.out.println("scaleW = " + scaleW +" scaleH" + scaleH);float scale = scaleW > scaleH ? 1 / scaleW : 1 / scaleH;   //scale是缩放比例,取最小比例的进行缩放System.out.println("scale = " + scale);matrix.postScale(scale, scale);        Bitmap bitss[][] = new Bitmap[mLevelNow][mLevelNow];ImageView[][] cache = new ImageView[mLevelNow][mLevelNow];int cont = 1;for (int i = 0; i < mLevelNow; i++) {for (int j = 0; j < mLevelNow; j++) {int mX = i * mImageWidth;int mY = j * mImageHeight;// 第一个是要在那个图片上截取 mX,y是要在这个图的那个位置截取// mImageWidth,mImageHeight是截取的长和宽, matrix是缩放比例Bitmap mapi = Bitmap.createBitmap(mBitmap, mX, mY, mImageWidth,mImageHeight, matrix, true);bitss[i][j] = mapi;ImageView img = new ImageView(this);BitmapDrawable draw = new BitmapDrawable(bitss[i][j]);img.setImageDrawable(draw);img.setId(cont);img.setScaleType(ScaleType.FIT_XY);img.setOnClickListener(OnClickImageView1);cache[i][j] = img;     //cache存放着整张图切割后的小图片cont++;}}for (int i = 0; i < mImageNum.length; i++) {int mX = mImageNum[i] / mLevelNow;    //确定第几行int mY = mImageNum[i] % mLevelNow;  //确定第几列int x1 = i / mLevelNow;int y1 = i % mLevelNow;mImages[x1][y1] = cache[mX][mY];    //将cache里面的小图片随机放入mImages数组里面}}/*** @brief 监听点击操作,以便判断是否需要互相交换小图片* */private android.view.View.OnClickListener OnClickImageView1 = new ImageView.OnClickListener() {@Overridepublic void onClick(View v) {if (mClickNum == 0) {// 即需要交换的第一个图片for (int i = 0; i < mImages.length; i++) {boolean f = false;for (int j = 0; j < mImages[i].length; j++) {ImageView imgg = mImages[i][j];if (imgg == v) {   //所点击的刚好是指定的小图片区域mX = i;mY = j;mClickNum++;     //点击了一次f = true;break;}}if (f) {break;}}} else {// 即需要交换的第二个图片for (int i = 0; i < mImages.length; i++) {for (int j = 0; j < mImages[i].length; j++) {ImageView imgg = mImages[i][j];if (imgg == v) {if (mClickNum == 1) {changePosition(i, j, mX, mY);mX = 0;mY = 0;mClickNum = 0;}}}}}}};/*** @brief 判断是否需要互相交换小图片* @param x1 第一张图片左上角x坐标的值* @param y1 第一张图片左上角y坐标的值* @param x2 第二张图片左上角x坐标的值* @param y2 第二张图片左上角y坐标的值* */private void changePosition(int x1, int y1, int x2, int y2) {// 判断宽和高差的绝对值是否是1,如果是1的话交换两张图片,不是1的话提示用户if (Math.abs(x1 - x2) + Math.abs(y1 - y2) != 1) {System.out.println("not link....");Builder bul = new AlertDialog.Builder(this);   //弹出相应对话框bul.setTitle(R.string.dialog);bul.setMessage(R.string.cannot_change);bul.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).show();} else {  //相邻,两张图片进行交换System.out.println("link....");String str = "";ImageView bitF = null;bitF = mImages[x1][y1];mImages[x1][y1] = mImages[x2][y2];mImages[x2][y2] = bitF;for (int i = 0; i < mImages.length; i++) {for (int j = 0; j < mImages[i].length; j++) {ImageView img = mImages[i][j];//得到ImageView的父控件LinearLayout pa = (LinearLayout) img.getParent();// 再移除ImageView使其父控件没有,移除父控件,重新用setLayout()进行布局pa.removeView(img);}}setLayout();   //将进行变换操作的图片显示出来for (int i = 0; i < mImages.length; i++) {for (int j = 0; j < mImages[i].length; j++) {str += mImages[i][j].getId();      //取对应小图片的ID,相当于R.id.mImages[i][j]}}//根据具体切割次数mLevelNow,判断最后一次变换是否已经拼好switch (mLevelNow) {case 2:if (str.equals("1324")) {// “1324”的意思是,将图片2*2地切割,有四块,标号先竖着,然后再横着来1234,根据getId取值互相比较this.success();}break;case 3:if (str.equals("147258369")) {this.success();}break;case 4:if (str.equals("15913261014371115481216")) {this.success();}break;case 5:if (str.equals("16111621271217223813182349141924510152025")) {this.success();}break;}}}/*** @brief 完成拼图后,提示成功完成对话框,点击按钮进入下一个Activity界面*/public void success() {Builder bul = new AlertDialog.Builder(this);bul.setTitle(R.string.dialog);bul.setMessage(R.string.congratulation);bul.setPositiveButton(R.string.next_Label, new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {Intent intent = new Intent(SePintu.this, TheEnd.class);SePintu.this.startActivity(intent);       //点击确定后跳转到下一个Activity}});bul.show();System.out.println("success");}
}

通过构造函数,进行画图布局,PictureLayout.java

/*** @file PictureLayout.java* @brief 重新布置打乱后的拼图* @author zhoujun* @version V1.0.00* @date 2012/09/12* Blog: http://blog.csdn.net/jjzhoujun2010
*/package com.example.zhangbeta2;import android.content.Context;
import android.widget.ImageView;
import android.widget.LinearLayout;
/*** brief 重新布置打乱后的拼图* */
public class PictureLayout extends LinearLayout{public PictureLayout(Context context, ImageView[][] images) {super(context);setLayout(context, images);setBackgroundColor(0xffff7777);      //为了和照片边缘区分开,我添加了背景颜色}/*** @brief 重新布置打乱后的拼图* @param view 当前被拆分打乱的照片* */private void setLayout(Context context, ImageView[][] view) {LinearLayout linralayout = new LinearLayout(context);linralayout.setOrientation(LinearLayout.VERTICAL);linralayout.setPadding(0, 0, 0, 0);for (int i = 0; i < view.length; i++) {LinearLayout liner = new LinearLayout(context);liner.setOrientation(LinearLayout.HORIZONTAL);int leng = view[i].length;for (int j = 0; j < leng; j++) {ImageView img = (ImageView) view[i][j];liner.addView(img);}linralayout.addView(liner);liner = null;}this.addView(linralayout);}
}

游戏原图显示,SourceImageAct.java

/*** @file SourceImageAty.java* @brief 显示未打乱的原图* @author zhoujun* @version V1.0.00* @date 2012/09/12* Blog: http://blog.csdn.net/jjzhoujun2010*/package com.example.zhangbeta2;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
/*** @brief 显示未打乱的原图 * */
public class SourceImageAty extends Activity{private ImageView mPic1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.source);mPic1 = (ImageView)findViewById(R.id.pic1);Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.pic1);mPic1.setImageBitmap(bitmap1);mPic1.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubfinish();   //点击屏幕图片即退出当前Activity}});}
}

游戏方法Activity, Method.java

/*** @file Method.java* @brief 实现拼图游戏里面“游戏说明”的Activity* @author zhoujun* @version V1.0.00* @date 2012/09/12* Blog: http://blog.csdn.net/jjzhoujun2010*/package com.example.zhangbeta2;import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;/*** @brief 实现点击拼图游戏里面“游戏说明”按钮后跳转后的Activity* */
public class Method extends Activity{Button mBackBtn = null;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.method);mBackBtn = (Button)findViewById(R.id.backBtn);mBackBtn.setOnClickListener(new backOnClickListener());}/*** @brief 本类功能:设置返回按钮监听器,点击按钮销毁当前Activity,返回拼图游戏Activity*/class backOnClickListener implements OnClickListener{@Overridepublic void onClick(View v) {// TODO Auto-generated method stubfinish();}}
}

最后界面,TheEnd.java

/*** @file TheEnd.java* @brief 最后的显示界面,包含两个来实现自动播放功能的按钮* @author zhoujun* @version V1.0.00* @date 2012/09/12* Blog: http://blog.csdn.net/jjzhoujun2010*/package com.example.zhangbeta2;import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
/*** @brief 最后的显示界面,包含两个来实现自动播放功能的按钮*/
public class TheEnd extends Activity{private Intent mIntentMusic = new Intent("com.angel.Android.MUSIC");@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.end);setCompenent();}/*** @brief 设置按钮,点击相应按钮,自动给指定号码进行拨号* */private void setCompenent(){Button callExitBtn = (Button)findViewById(R.id.call_exit);callExitBtn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:10086")); //自动拨号,由于隐私,改成10086.。。stopService(mIntentMusic);startActivity(intent);                }           });Button exitCallBtn = (Button)findViewById(R.id.exit_call);exitCallBtn.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent intent = new Intent(Intent.ACTION_CALL, Uri.parse("tel:10086"));stopService(mIntentMusic);startActivity(intent);              }           }); }
}

背景音乐实现,MusicServer.java

/*** @file MusicServer.java* @brief 开启一个Server,用来自动播放背景音乐* @author zhoujun* @version V1.0.00* @date 2012/09/12* Blog: http://blog.csdn.net/jjzhoujun2010*/package com.example.zhangbeta2;import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
/*** @brief 继承一个服务,用来播放背景音乐* */
public class MusicServer extends Service { private MediaPlayer mMediaPlayer; /*** @brief 绑定对应的intent* @return null*/@Override public IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}/*** @brief 根据intent,打开背景音乐*/@Override public void onStart(Intent intent,int startId){super.onStart(intent, startId);if(mMediaPlayer==null){ // R.raw.happy是资源文件,MP3格式的,存放在res资源下raw文件夹里,没有的话新建个 mMediaPlayer = MediaPlayer.create(this, R.raw.happy);mMediaPlayer.setLooping(true);mMediaPlayer.start();   } }/*** @brief 关闭背景音乐*/@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();mMediaPlayer.stop();}
}

JAVA文件就这些,剩下就是xml文件了。

main.xml文件如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="fill_parent"android:layout_height="fill_parent" android:orientation="vertical" android:background="@drawable/background"><TextViewandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#abcdef"android:text="@string/hello_world"tools:context=".Main" /><LinearLayoutandroid:orientation="horizontal"android:layout_width="fill_parent"android:layout_height="fill_parent"><Buttonandroid:id="@+id/buttonNext"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/next"/><Buttonandroid:id="@+id/buttonExit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/exit"/>    </LinearLayout>
</LinearLayout>

method.xml文件如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/method_detail"/><Buttonandroid:id="@+id/backBtn"android:layout_width="fill_parent" android:layout_height="wrap_content"android:text="@string/back_label"/></LinearLayout>

source.xml文件如下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" android:background="#ffff7777"><ImageViewandroid:id="@+id/pic1"android:layout_width="fill_parent"android:layout_height="fill_parent"></ImageView></LinearLayout>

end.xml文件如下

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="fill_parent"android:layout_height="fill_parent" android:orientation="vertical" ><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:layout_gravity="center_horizontal"android:background="@drawable/cake_bak">        </LinearLayout><LinearLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><Buttonandroid:id="@+id/call_exit"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/call_exit"/><Buttonandroid:id="@+id/exit_call"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_weight="1"android:text="@string/exit_call"/>                </LinearLayout></LinearLayout>

AndroidManifest.xml文件如下

<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.example.zhangbeta2"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="15" /><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".Main"android:label="@string/title_activity_main" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity><activity android:name=".SePintu"android:label="@string/label_pintu1"/><activityandroid:name=".Method"android:label="@string/method_label"/><activityandroid:name=".TheEnd"android:label="@string/label_theEnd"/><activityandroid:name=".SourceImageAty"android:label="@string/source_back_label"/><service android:name=".MusicServer"><intent-filter><action android:name="com.angel.Android.MUSIC"/><category android:name="android.intent.category.default" /></intent-filter></service></application><uses-permission android:name="android.permission.CALL_PHONE"></uses-permission></manifest>

在我的测试中,我发现存在以下几个问题,(1)当我用Service来播放背景音乐时候,如果是通过键盘上返回键退出的话,就不会stopService,背景音乐就一直播放,由于赶着送出去的时间关系,我没有修复它,上网查了下可以通过重写onKeyDown按键,来实现关闭音乐。(2)分辨率的问题,我主要是针对4.0屏幕设计的,有时候用的是fill_parent,有时候不同屏幕会造成图片的变形。若各位有更好的方法,欢迎交流。

应用程序APK下载地址:http://download.csdn.net/detail/jjzhoujun2010/4568777

源码下载地址:http://download.csdn.net/detail/jjzhoujun2010/4635304

参考文章: - - 不好意思,综合看得太多了,记不得那个了,其中拼图的打乱算法我是参考别人的,若有人看到此文章,请告诉我链接,多谢。

原创文章,欢迎转载,转载请注明:https://ifish.site/android-gift.html

CSDN: blog.csdn.net/jjzhoujun2010

作者:Dream Fly  

Android生日礼物(含拼图游戏,背景音乐,自动拨号等功能实现)--根据代码规范修改注释以及定义相关推荐

  1. Android群英传-拼图游戏puzzle-6点吐槽

    一.缘由   经常写文章,混了一些C币.最近在深入学习Android应用开发,就从商城里买了一本<Android群英传>. 这本书的内容,不是纯粹的入门那种,分几个章节,重点讲解Activ ...

  2. 自动拼图android github,GitHub - zero0011/Puzzle: 拼图游戏 , 可自动实现 拼图操作

    拼图游戏 启动 前端 npm i npm run dev 后端 cd server npm i nodemon app.js 实现功能有 普通的拼图功能 自动拼图功能(难点) 游戏聊天室的设计 效果大 ...

  3. Android自定义图片拼图游戏

    项目描述: 该app实现了拼图图片选择,分数排行,游戏设置等功能,是一个功能完整的拼图游戏,适合新手学习. 开发语言: java 技术框架: 无 开发工具: AndroidStudio2.2,新手最好 ...

  4. Android 实战美女拼图游戏 你能坚持到第几关

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/40595385,本文出自: [张鸿洋的博客] 1.概述 继2048之后,今天给大 ...

  5. Android 实战美女拼图游戏 你能坚持到第几关

    1.概述 继2048之后,今天给大家带来一个拼图游戏,当然了不是很传统那个缺一块的拼图,那游戏我不会玩~~所有我们换个方式玩拼图,怎么玩呢,把图片且成很多份,点击交换拼成一张完整的:这样关卡也很容易设 ...

  6. android怎实现拼图功能,Android实战开发——拼图游戏

    时间改变的实现 在 MainActivity.java 中的 onCreate 函数中添加如下内容: //一进来每隔1s就发一条空消息出去,接收到这个空消息并让TextView发生改变,形成计数器的效 ...

  7. Eclipse自动补全功能轻松设置 || 不需要修改编辑任何文件

    本文介绍如何设置Eclipse代码自动补全功能.轻松实现输入任意字母均可出现代码补全提示框.   Eclipse代码自动补全功能默认只包括 点"."  ,即只有输入".& ...

  8. android手势第一次设置密码_Android手势密码--设置和校验功能的实现代码

    Android手势密码--设置和校验功能的实现代码 发布时间:2020-08-23 06:20:27 来源:脚本之家 阅读:83 效果图如下,大家感觉不错请参考实现代码 具体代码如下所示: priva ...

  9. android平台下拼图游戏设计,android 拼图游戏 源码下载

    [实例简介] [实例截图] [核心代码] package com.game.pintu; import java.util.ArrayList; import java.util.List; impo ...

最新文章

  1. 并发 IO多路复用 select 非asyncio
  2. 经济民族主义的前夜?普华永道思略特全球创新1000强解读
  3. mysql深入浅出_《深入浅出mysql》学习笔记
  4. 引入 ServletContextListener @Autowired null 解决办法
  5. 关于static变量的定义及性质的深层介绍
  6. 联合国隐私监督机构:大规模信息监控并非行之有效
  7. 类型转换异常处理java.lang.RuntimeException
  8. 军哥华为HCNP(科目H12-221)真题解析课程:1-30题
  9. HDU 5950——Recursive sequence
  10. Qt工作笔记-对QItemDelegate自定义委托的理解
  11. Linux下qwt源码编译,QWT的编译与配置
  12. Win7matlab7.0安装教程,Win7下MATLAB7.0安装教程
  13. php进程名,DOS根据进程名或PID删除进程命令
  14. Android2.1--如何在android模拟器上安装与删除.APK文件
  15. 爬虫:requests BeautifulSoup 实战案例
  16. 浏览器控制台Network面板简述
  17. 技巧分享篇---如何从GitHub上下载某个项目中单个文件的方法
  18. Hibernate逍遥游记-第13章 映射实体关联关系-001用外键映射一对一(many-to-one unique=true、one-to-one)...
  19. 英国大学计算机科学硕博连读,曼彻斯特大学硕博连读
  20. 人工智能-深度学习-yolov3口罩佩戴识别

热门文章

  1. YouTube上的视频听不懂英文怎么办?
  2. html 图片显示的几种方式
  3. JavaScript基础学习——CSS预处理Less
  4. 【云原生】docker+k8微服务容器化实战
  5. vue-echarts绘制地图轮廓
  6. Qt音视频开发06-海康sdk内核linux客户端
  7. Qt软件下载地址(开源,免费下载,解决方案)
  8. 春秋战国开局名臣搭配推荐
  9. 渗透测试SQL注入——Sqlilabs关卡详解
  10. Unity 旋转人物在设定的角度看向镜头(平滑转动)