《Android》课程设计报告

合集下载

Android课程设计报告模板

Android课程设计报告模板

android移动开发课程设计报告学生姓名:X X 学号:XXXXXXX 专业:计算机科学与技术班级:XXXXXXX 设计题目:口袋微博学年学期:2015 年秋季学期指导教师:X X目录(示例)一、设计题目 (1)二、设计目的 (1)三、设计原理及方案 (1)1使用的软件工具和环境 (1)2需求分析与概要设计 (1)3数据库设计(若有) (2)4详细设计和关键问题 (3)四、实现效果 (8)五、设计体会 (69)参考文献 (71)一、设计题目Android社交分享平台——口袋微博设计目的二、设计原理及方案首先要实现以下这些功能:Android端登录和注册模块的实现Android端个人中心模块的实现Android端快速发布模块的实现Android端查看联系人模块的实现Android端管理日志模块的实现Android端管理相册模块的实现1使用的软件工具和环境1)PC计算机2)JDK安装包3)Eclipse安装包4)Android SDK安装包5)ADT插件2需求分析与概要设计(详细描述系统的功能需求)Android端登录和注册模块的实现Android端个人中心模块的实现Android端快速发布模块的实现Android端查看联系人模块的实现Android端管理日志模块的实现Android端管理相册模块的实现(详细描述系统结构;例如总体架构设计、流程图、用例图等,并分别描述)说明:这里的用例图和类图的对应关系可以在下面的E-R图上找到,这里我就略了一下。

Android端总体架Web端的原理示意图数据库设计(若有的必须给出,没有的给出其他重要设计过程)(给出ER关系图及数据库表)用powerdesigner设计对应关系,并生成表,E-R图3详细设计和关键问题(分功能模块描述设计细节,例如详细功能图、类图和关键流程图等。

遇到的关键Android 问题是如何解决的)相册列表:功能图查看修改权限二、快速发布:三、实现效果(包括系统描述和程序运行界面的截图)1.口袋微博用户登录界面2.口袋微博个人中心——快速发布功能界面3.口袋微博个人中心——我的好友功能界面4.口袋微博个人中心——最近访客功能界面5.口袋微博个人中心——日志列表功能界面6.口袋微博个人中心——相册列表功能界面7.口袋微博——搜索好友界面以下是部分重要代码由于代码太多无法容纳(1)LoginActivity.java登录界面package wyf.wpf;import static wyf.wpf.ConstantUtil.SERVER_ADDRESS; import static wyf.wpf.ConstantUtil.SERVER_PORT; import android.app.Activity;import android.app.ProgressDialog;import android.content.Intent;import android.content.SharedPreferences;import android.os.Bundle;import android.os.Looper;import android.view.View;import android.widget.Button;import android.widget.CheckBox;import android.widget.EditText;import android.widget.ImageButton;import android.widget.Toast;public class LoginActivity extends Activity {MyConnector mc = null;ProgressDialog pd;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.login);checkIfRemember();Button btnLogin = (Button)findViewById(R.id.btnLogin);btnLogin.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {pd = ProgressDialog.show(LoginActivity.this, "请稍候", "正在连接服务器...", true, true);login();}});Button btnReg = (Button)findViewById(R.id.btnReg);btnReg.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Intent intent = new Intent(LoginActivity.this, wyf.wpf.RegActivity.class);startActivity(intent);finish();}});ImageButton ibExit = (ImageButton)findViewById(R.id.ibExit);ibExit.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {android.os.Process.killProcess(android.os.Process.myPid()); //结束进程,退出程序}});}//方法:连接服务器进行登录public void login(){new Thread(){public void run(){Looper.prepare();try{if(mc == null){mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);}EditText etUid = (EditText)findViewById(R.id.etUid); //获得帐号EditTextEditText etPwd = (EditText)findViewById(R.id.etPwd); //获得密码EditTextString uid = etUid.getEditableText().toString().trim(); //获得输入的帐号String pwd = etPwd.getEditableText().toString().trim(); //获得输入的密码if(uid.equals("") || pwd.equals("")){ //判断输入是否为空Toast.makeText(LoginActivity.this, "请输入帐号或密码!", Toast.LENGTH_SHORT).show();//输出提示消息return;}String msg = "<#LOGIN#>"+uid+"|"+pwd; //组织要返回的字符串mc.dout.writeUTF(msg); //发出消息String receivedMsg = mc.din.readUTF(); //读取服务器发来的消息pd.dismiss();if(receivedMsg.startsWith("<#LOGIN_SUCCESS#>")){ //收到的消息为登录成功消息receivedMsg = receivedMsg.substring(17);String [] sa = receivedMsg.split("\\|");CheckBox cb = (CheckBox)findViewById(R.id.cbRemember); //获得CheckBox 对象if(cb.isChecked()){rememberMe(uid,pwd);}//转到功能面板Intent intent = new Intent(LoginActivity.this,FunctionTabActivity.class);intent.putExtra("uno", sa[0]);startActivity(intent); //启动功能Activityfinish();}else if(msg.startsWith("<#LOGIN_FAIL#>")){ //收到的消息为登录失败Toast.makeText(LoginActivity.this, msg.substring(14), Toast.LENGTH_LONG).show();Looper.loop();Looper.myLooper().quit();}}catch(Exception e){e.printStackTrace();}}}.start();}//方法:将用户的id和密码存入Preferencespublic void rememberMe(String uid,String pwd){SharedPreferences sp = getPreferences(MODE_PRIV ATE); //获得PreferencesSharedPreferences.Editor editor = sp.edit(); //获得Editoreditor.putString("uid", uid); //将用户名存入Preferenceseditor.putString("pwd", pwd); //将密码存入Preferencesmit();}//方法:从Preferences中读取用户名和密码public void checkIfRemember(){SharedPreferences sp = getPreferences(MODE_PRIVA TE); //获得PreferencesString uid = sp.getString("uid", null);String pwd = sp.getString("pwd", null);if(uid != null && pwd!= null){EditText etUid = (EditText)findViewById(R.id.etUid);EditText etPwd = (EditText)findViewById(R.id.etPwd);CheckBox cbRemember = (CheckBox)findViewById(R.id.cbRemember);etUid.setText(uid);etPwd.setText(pwd);cbRemember.setChecked(true);}}@Overrideprotected void onDestroy() {if(mc != null){mc.sayBye();}super.onDestroy();}}(2)DirayActivity.javapackage wyf.wpf;import static wyf.wpf.ConstantUtil.SERVER_ADDRESS; import static wyf.wpf.ConstantUtil.SERVER_PORT;import java.util.ArrayList;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.Gravity;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;import android.widget.AdapterView.OnItemClickListener;public class DiaryActivity extends Activity{ArrayList<String []> diaryList = new ArrayList<String []>();MyConnector mc = null;String uno = null;String visitor = null;BaseAdapter ba = new BaseAdapter() {@Overridepublic View getView(int position, View convertView, ViewGroup parent) {LinearLayout ll = new LinearLayout(DiaryActivity.this);TextView tvTitle = new TextView(DiaryActivity.this);ll.setOrientation(LinearLayout.VERTICAL);tvTitle.setTextAppearance(DiaryActivity.this, R.style.title);tvTitle.setGravity(Gravity.LEFT); //设置TextView的对齐方式tvTitle.setText(diaryList.get(position)[1]);TextView tvContent = new TextView(DiaryActivity.this);tvContent.setTextAppearance(DiaryActivity.this, R.style.content); //设置字体大小tvContent.setGravity(Gravity.LEFT); //设置TextView的对齐方式tvContent.setText(diaryList.get(position)[2]); //设置显示的内容ll.addView(tvTitle);ll.addView(tvContent);return ll;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic Object getItem(int arg0) {return null;}@Overridepublic int getCount() {return diaryList.size();}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Intent intent = getIntent();uno = intent.getStringExtra("uno"); //获得主人IDvisitor = intent.getStringExtra("visitor"); //获得访客IDgetDiaryList();setContentView(yout.diary);ListView lvDiary = (ListView)findViewById(R.id.lvDiary); //获得ListView对象lvDiary.setAdapter(ba);lvDiary.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View v, int position,long id) {Intent intent = new Intent(DiaryActivity.this,CommentActivity.class);intent.putExtra("rid", diaryList.get(position)[0]);intent.putExtra("uno", uno);intent.putExtra("visitor", visitor);startActivity(intent);}});}//方法:获取日志列表public void getDiaryList(){new Thread(){public void run(){try{mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);mc.dout.writeUTF("<#GET_DIARY#>"+uno+"|"+"1");int size = mc.din.readInt(); //读取日志的长度for(int i=0;i<size;i++){ //循环接受日志信息String diaryInfo = mc.din.readUTF(); //读取日志信息String [] sa = diaryInfo.split("\\|");diaryList.add(sa); //将日志信息添加到列表中}}catch(Exception e){e.printStackTrace();}}}.start();}@Overrideprotected void onDestroy() {if(mc != null){mc.sayBye();mc = null;}super.onDestroy();}}(3)口袋微博_____个人中心PublishActivity.javapackage wyf.wpf;import static wyf.wpf.ConstantUtil.*;import android.app.Activity;import android.app.AlertDialog;import android.app.ProgressDialog;import android.content.DialogInterface;import android.content.Intent;import android.os.Bundle;import android.os.Looper;import android.view.Gravity;import youtInflater;import android.view.View;import android.view.ViewGroup;import youtParams;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.EditText;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class PublishActivity extends Activity{String [] items = { //存放ListView中的选项内容"更新心情","发布日志","拍照上传"};int [] imgIds = {R.drawable.p_status,R.drawable.p_diary,R.drawable.p_shoot};String uno = null; //存放MyConnector mc = null; //MyConnector对象引用ProgressDialog pd = null; //ProgressDialog对象引用View dialog_view = null; //心情BaseAdapter ba = new BaseAdapter() {@Overridepublic View getView(int position, View convertView, ViewGroup parent) {LinearLayout ll = new LinearLayout(PublishActivity.this);ll.setOrientation(LinearLayout.HORIZONTAL);ll.setGravity(Gravity.CENTER);ImageView iv = new ImageView(PublishActivity.this); //创建ImageView对象iv.setAdjustViewBounds(true);iv.setImageResource(imgIds[position]); //设置ImageView的ll.addView(iv); //将ImageView添加到线性布局中TextView tv = new TextView(PublishActivity.this);tv.setPadding(10, 0, 0, 0);tv.setLayoutParams(new youtParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));tv.setTextAppearance(PublishActivity.this, R.style.title);tv.setText(items[position]); //设置TextView显示的内容ll.addView(tv);return ll;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic int getCount() {return items.length;}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);Intent intent = getIntent(); //获得启动该Activity的Intentuno = intent.getStringExtra("uno");setContentView(yout.publish); //设置当前屏幕ListView lvPublish = (ListView)findViewById(R.id.lvPublish); //获得ListView对象引用lvPublish.setAdapter(ba);lvPublish.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View v, int position,long id) {switch(position){ //判断点击的是哪一个选项case 0: //更新心情LayoutInflater li = LayoutInflater.from(PublishActivity.this);dialog_view = li.inflate(yout.publish_status, null);new AlertDialog.Builder(PublishActivity.this).setTitle("更新心情").setIcon(R.drawable.p_status).setView(dialog_view).setPositiveButton("发表",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {pd = ProgressDialog.show(PublishActivity.this, "请稍候", "正在更新心情...",true,true);updateStatus();}}).setNegativeButton("取消",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {}}).show();break;case 1: //发表日志Intent intent1 = new Intent(PublishActivity.this,PublishDiaryActivity.class);//创建Intentintent1.putExtra("uno", uno); //设置Intent的Extra字段startActivity(intent1);break;case 2: //拍照上传Intent intent2 = new Intent(PublishActivity.this,ShootActivity.class);//创建Intentintent2.putExtra("uno", uno); //设置Intent的Extra字段startActivity(intent2);break;}}});}//方法:连接服务器,更新心情public void updateStatus(){new Thread(){public void run(){Looper.prepare();EditText etStatus = (EditText)dialog_view.findViewById(R.id.etInputStatus);String status = etStatus.getEditableText().toString().trim(); //获得心情内容if(status.equals("")){ //如果输入的心情为空pd.dismiss();Toast.makeText(PublishActivity.this, "请输入更新的心情", Toast.LENGTH_LONG).show();//输出提示Looper.loop();return;}String message = "<#NEW_STA TUS#>"+status+"|"+uno;if(mc == null){mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);}try{mc.dout.writeUTF(message); //向服务器发送更新的心情pd = ProgressDialog.show(PublishActivity.this, "正在连接网络", "请稍候",true);String reply = mc.din.readUTF(); //从服务器返回的回复pd.dismiss();if(reply.equals("<#STA TUS_SUCCESS#>")){ //心情更新成功Toast.makeText(PublishActivity.this, "心情更新成功!", Toast.LENGTH_LONG).show();Looper.loop();}else { //心情更新失败Toast.makeText(PublishActivity.this, "心情更新失败!", Toast.LENGTH_LONG).show();Looper.loop();}}catch(Exception e){e.printStackTrace();}Looper.myLooper().quit();}}.start();}@Overrideprotected void onDestroy() {if(mc != null){mc.sayBye();}super.onDestroy();}}(4)注册处理____RegActivity.javapackage wyf.wpf;import static wyf.wpf.ConstantUtil.SERVER_ADDRESS;import static wyf.wpf.ConstantUtil.SERVER_PORT;import android.app.Activity;import android.app.ProgressDialog;import android.content.Intent;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.LinearLayout;import android.widget.Toast;public class RegActivity extends Activity{MyConnector mc = null; //声明MyConnector对象String uno = ""; //记录用户的IDProgressDialog pd= null; //声明进度对话框Handler myHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch(msg.what){case 0:View linearLayout = (LinearLayout)findViewById(R.id.regResult); //获得线性布局linearLayout.setVisibility(View.VISIBLE); //设置可见性EditText etUno = (EditText)findViewById(R.id.etUno);etUno.setText(uno);break;}super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.reg); //设置当前屏幕Button btnReg = (Button)findViewById(R.id.btnReg); //获得注册Button按钮对象btnReg.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {pd = ProgressDialog.show(RegActivity.this, "请稍候...", "正在连接服务器...", false);register();}});Button btnBack = (Button)findViewById(R.id.btnBack); //获得返回按钮对象btnBack.setOnClickListener(new View.OnClickListener() { //为返回按钮添加监听器@Overridepublic void onClick(View v) {Intent intent = new Intent(RegActivity.this,LoginActivity.class); //创建Intent对象startActivity(intent); //启动Activityfinish();}});Button btnEnter = (Button)findViewById(R.id.btnEnter); //获得进入功能面板按钮对象btnEnter.setOnClickListener(new View.OnClickListener() { //为进入功能面板的按钮添加监听器@Overridepublic void onClick(View v) {Intent intent = new Intent(RegActivity.this,FunctionTabActivity.class); //创建Intentintent.putExtra("uno", uno); //设置Extra字段startActivity(intent); //启动FunctionTabfinish(); //关闭该Activity}});}//方法:连接服务器,进行注册public void register(){new Thread(){public void run(){Looper.prepare();//获得用户输入的数据并进行验证EditText etName = (EditText)findViewById(R.id.etName); //获得昵称EditText对象EditText etPwd1 = (EditText)findViewById(R.id.etPwd1); //获得密码EditText对象EditText etPwd2 = (EditText)findViewById(R.id.etPwd2); //获得确认密码EditText 对象EditText etEmail = (EditText)findViewById(R.id.etEmail); //获得邮箱EditText对象EditText etStatus = (EditText)findViewById(R.id.etStatus); //获得心情EditText对象String name = etName.getEditableText().toString().trim(); //获得昵称String pwd1 = etPwd1.getEditableText().toString().trim(); //获得密码String pwd2 = etPwd2.getEditableText().toString().trim(); //获得确认密码String email = etEmail.getEditableText().toString().trim(); //获得邮箱String status = etStatus.getEditableText().toString().trim(); //获得状态if(name.equals("") || pwd1.equals("") || pwd2.equals("") || email.equals("") || status.equals("")){ Toast.makeText(RegActivity.this, "请将注册信息填写完整", Toast.LENGTH_LONG).show();return;}if(!pwd1.equals(pwd2)){ //判断两次输入的密码是否一致Toast.makeText(RegActivity.this, "两次输入的密码不一致!", Toast.LENGTH_LONG).show();return;}try{mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);String regInfo = "<#REGISTER#>"+name+"|"+pwd1+"|"+email+"|"+status;mc.dout.writeUTF(regInfo);String result = mc.din.readUTF();pd.dismiss();if(result.startsWith("<#REG_SUCCESS#>")){ //返回信息为注册成功result= result.substring(15); //去掉信息头uno = result; //记录用户的IDmyHandler.sendEmptyMessage(0); //发出Handler消息Toast.makeText(RegActivity.this, "注册成功!", Toast.LENGTH_LONG).show();}else{ //注册失败Toast.makeText(RegActivity.this, "注册失败!请重试!", Toast.LENGTH_LONG).show();}}catch(Exception e){e.printStackTrace();}}}.start();}@Overrideprotected void onDestroy() {if(mc != null){mc.sayBye();}super.onDestroy();}}(5)AlbumActivity.javapackage wyf.wpf;import static wyf.wpf.ConstantUtil.IMAGESWITCHER_HEIGHT;import static wyf.wpf.ConstantUtil.PHOTO_HEIGHT;import static wyf.wpf.ConstantUtil.PHOTO_WIDTH;import static wyf.wpf.ConstantUtil.SERVER_ADDRESS;import static wyf.wpf.ConstantUtil.SERVER_PORT;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Color;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.opengl.Visibility;import android.os.Bundle;import android.os.Handler;import android.os.Looper;import android.os.Message;import android.view.View;import android.view.ViewGroup;import android.view.animation.AnimationUtils;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.Gallery;import android.widget.ImageSwitcher;import android.widget.ImageView;import android.widget.Spinner;import android.widget.TextView;import android.widget.Toast;import android.widget.ViewSwitcher;import android.widget.AdapterView.OnItemClickListener;import android.widget.AdapterView.OnItemSelectedListener;public class AlbumActivity extends Activity implements ViewSwitcher.ViewFactory{ List<String []> photoInfoList = new ArrayList<String []>();Bitmap [] photoList; //存放图片的数组Gallery gl = null; //Gallery对象的引用ImageSwitcher is = null; //ImageSwitcher对象的引用Spinner sp = null; //Spinner对象的引用MyConnector mc = null; //MyConnector对象的引用String xid = ""; //存放相册的IDString uno = ""; //存放用户IDString visitor = ""; //存放访问者的IDString pid = ""; //存放当前显示的照片IDint from = -1; //启动该Activity的来源,0为MyAlbumListActivity,1为AlbumListActivityList<String []> albumInfoList = new ArrayList<String []>(); //存放相册信息,id和相册名称//Spinner的AdapterBaseAdapter baSpinner = new BaseAdapter() {@Overridepublic View getView(int position, View convertView, ViewGroup parent) {TextView tv = new TextView(AlbumActivity.this);tv.setTextSize(18.5f);tv.setTextColor(Color.DKGRAY);String [] sa = albumInfoList.get(position);tv.setText(sa[1]);return tv;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic int getCount() {return albumInfoList.size();}};//Gallery的AdapterBaseAdapter baGallery= new BaseAdapter() {@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ImageView iv = new ImageView(AlbumActivity.this);iv.setAdjustViewBounds(true);iv.setLayoutParams(new youtParams(PHOTO_WIDTH, PHOTO_HEIGHT));iv.setMaxHeight(PHOTO_HEIGHT); //设置ImageView显示的高度iv.setMaxWidth(PHOTO_WIDTH); //设置ImageView显示的宽度iv.setImageBitmap(photoList[position]); //设置ImageView显示的内容return iv;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic int getCount() {if(photoList != null){return photoList.length;}else{return 0;}}};//点下Gallery中的图片后触发的事件监听器OnItemClickListener myListener = new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View v, int position,long id) {if(is != null){ //如果ImageSwitcher不为空Drawable d = new BitmapDrawable(photoList[position]);is.setImageDrawable(d);}}};Handler myHandler = new Handler(){@Overridepublic void handleMessage(Message msg) {switch(msg.what){case 0:gl.setAdapter(baGallery);is.setImageDrawable(new BitmapDrawable(photoList[0]));break;}super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.album); //设置当前屏幕Intent intent = getIntent(); //获取启动该Activity的Intentuno = intent.getStringExtra("uno"); //获得Extra字段的unovisitor = intent.getStringExtra("visitor");from = intent.getIntExtra("from", -1); //获得Extra字段的fromint position = intent.getIntExtra("position", 0); //获得被选中的相册String [] albumInfoArray = intent.getStringArrayExtra("albumlist"); //获得相册信息数组xid = intent.getStringExtra("xid"); //获得被选中的相册编号albumInfoList = new ArrayList<String []>();for(String s:albumInfoArray){ //遍历信息数组String [] sa = s.split("\\|");albumInfoList.add(sa); //构建相册信息列表}sp = (Spinner)findViewById(R.id.spAlbum); //获得Spinner对象sp.setAdapter(baSpinner); //设置Spinner对象的Adaptersp.setSelection(position); //选中在前一个Activity中被选中的相册sp.setOnItemSelectedListener(new OnItemSelectedListener() { //为Spinner添加监听器@Overridepublic void onItemSelected(AdapterView<?> parent, View v,int position, long id) {xid = albumInfoList.get(position)[0]; //修改存储相册ID的成员变量getPhotoList(); //获得相册中的相片列表}@Overridepublic void onNothingSelected(AdapterView<?> parent) {}});gl = (Gallery)findViewById(R.id.galleryPhoto); //获得Gallery对象gl.setOnItemClickListener(myListener); //设置Gallery的OnItemClickListener监听器is = (ImageSwitcher)findViewById(R.id.isPhoto); //获得ImageSwitcher对象is.setFactory(this); //设置ImageSwitcher的Factoryis.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in)); //设置ImageSwitcher 的In动画is.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));//设置ImageSwitcher 的Out动画Button btnBack = (Button)findViewById(R.id.btnAlbumBack); //获得返回按钮btnBackbtnBack.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {switch(from){ //判断启动该Activity的来源case 0: //有MyAlbumListActivity启动Intent intent1 = new Intent(AlbumActivity.this,FunctionTabActivity.class);intent1.putExtra("uno", uno);intent1.putExtra("tab", "tab5");startActivity(intent1);finish();break;case 1: //由AlbumListActivity启动Intent intent2 = new Intent(AlbumActivity.this,HomePageActivity.class);intent2.putExtra("uno", uno);intent2.putExtra("visitor", visitor);intent2.putExtra("tab", "tab2");startActivity(intent2);finish();break;}}});Button btnDeletePhoto = (Button)findViewById(R.id.btnDeletePhoto);if(visitor != null){ //不是查看自己的相册btnDeletePhoto.setVisibility(View.GONE); //如果不是自己的相册,隐藏删除按钮}btnDeletePhoto.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {new AlertDialog.Builder(AlbumActivity.this).setTitle("提示").setIcon(R.drawable.alert_icon).setMessage("确认删除该照片?").setPositiveButton("确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {int pos = gl.getSelectedItemPosition();pid = photoInfoList.get(pos)[0];deletePhoto();}}).setNegativeButton("取消",null).show();}});}public void getPhotoList(){new Thread(){public void run(){Looper.prepare();mc = null;mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);mc.dout.writeUTF("<#GET_ALBUM#>"+xid);int size = 0; //获得相册长度size = mc.din.readInt(); //读取相册的长度if(size == 0){Toast.makeText(AlbumActivity.this, "该相册还未上传照片", Toast.LENGTH_LONG).show();Looper.loop();return;}photoInfoList = new ArrayList<String []>(size);photoList = new Bitmap[size];for(int i=0;i<size;i++){ //循环获取图片数据String photoInfo = mc.din.readUTF(); //读取相片信息String [] sa = photoInfo.split("\\|"); //切割字符串photoInfoList.add(sa); //将相片信息添加到列表中int photoLength = mc.din.readInt(); //读取相片长度byte [] buf = new byte[photoLength]; //创建相应长度的数组mc.din.read(buf); //读入图片数据photoList[i] = BitmapFactory.decodeByteArray(buf, 0, photoLength); //创建Bitmap }myHandler.sendEmptyMessage(0);}catch(Exception e){e.printStackTrace();}}}.start();}//方法:删除指定照片public void deletePhoto(){new Thread(){public void run(){Looper.prepare();if(mc ==null){mc = new MyConnector(SERVER_ADDRESS, SERVER_PORT);}String msg = "<#DELETE_PHOTO#>"+pid;mc.dout.writeUTF(msg);String reply = mc.din.readUTF();if(reply.equals("<#DELETE_PHOTO_SUCCESS#>")){Toast.makeText(AlbumActivity.this, "照片删除成功!", Toast.LENGTH_LONG).show();}else {Toast.makeText(AlbumActivity.this, "删除失败,请重试!", Toast.LENGTH_LONG).show();}getPhotoList();Looper.loop();}catch(Exception e){e.printStackTrace();}}}.start();}@Overridepublic View makeView() {ImageView iv = new ImageView(this);iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE);iv.setLayoutParams(newyoutParams(IMAGESWITCHER_HEIGHT,IMAGESWITCHER_HEIGHT));return iv;}@Overrideprotected void onDestroy() {if(mc != null){mc.sayBye();。

Android-课程设计报告

Android-课程设计报告

课程设计课程名称:嵌入式技术课程设计设计题目:基于Android系统的小查询工具学院:信息工程与自动化学院专业:计算机科学与技术年级: 2010级学生姓名:指导教师:日期: 2013/7/8教务处制课程设计任务书信息工程与自动化学院计算机科学与技术专业 2010 年级学生姓名:课程设计题目:基于Android系统的小查询工具课程设计主要内容:通过本课程设计,使学生巩固软件工程的基本概念、原理,熟悉安卓应用开发环境和技术,学会完成一个移动终端应用软件的分析、设计、编码测试和安装,将理论与实际相结合,强化学生的项目开发和团队意识,提高学生分析能力和创新能力基本理论1、 Android系统的开发方法及基本原理2、 JavaEE应用程序设计开发技术实验方法与基本要求要求学生掌握Windows环境下Android系统开发的一般方法,AndroidSdk 集成开发环境的构建及JavaEE应用程序的开发。

整个设计过程必须由学生自己独立完成,课程设计按二人一组,分组进行全过程的设计。

设计内容1、Windows环境下构建Android系统的开发环境2、基于Android模拟手机,设计手机应用程序3、将程序下载的Android手机上应用设计指导教师(签字):教学基层组织负责人(签字):年月日目录一、课程设计的目的及要求 (3)1.1 课程设计的目的 (3)1.2 课程设计要求 (3)二、Android应用程序开发背景 (3)2.1开发背景 (3)2.2开发环境 (4)三、Android应用程序开发环境搭建 (5)3.1所需软件的下载 (5)3.2相应软件的安装 (5)四、“小查询工具”的设计与实现 (10)1. 总体设计 (10)1)界面设计 (10)2)功能设计 (12)2. 详细设计 (12)1)模块设计 (12)2)编码实现 (12)3. 手机上运行截图 (14)五、总结与体会 (16)基于Android系统的小查询工具设计一、课程设计的目的及要求1.1 课程设计的目的1) 复习、巩固Java语言的基础知识,进一步加深对Java语言的理解和掌握;搭建一个完整的安卓开发环境。

android课程设计报告_2

android课程设计报告_2

目录1. 概述 (1)2. 项目设计与实现 (1)2.1欢迎界面 (1)2.1.1界面布局 (2)2.1.2功能实现 (2)2.2登陆界面 (2)2.2.1 界面布局 (2)2.2.2 功能实现 (2)2.3微信显示界面 (4)2.3.1 界面布局 (4)2.3.2功能实现 (5)2.4主界面 (5)2.4.1 界面布局 (5)2.4.2 功能实现 (5)3.参考文献 (5)4.致谢 (6)1.概述移动互联网时代的来临, 直接促进了搭载智能操作系统、具有强大扩展性的智能手机、平板电脑等移动终端产业的蓬勃发展。

搭载安卓操作系统的智能手机目前已经成为市场上最炙手可热的智能产品。

开放的源代码和零成本已经让安卓在全世界范围内受到青睐并迅速获得了主要手机厂商和数百万软件开发者的支持, 2011年安卓系统的市场份额已经超过Symbian, 成为全球第一大智能手机操作系统。

本项目基于QQ和微信等聊天工具, 仿制其功能初步实现了登录界面和主界面的简单设置, 剩余的功能我会在以后更加努力实现。

2. 项目设计与实现2.1欢迎界面图1 欢迎界面2.1.1界面布局整体采用相对布局, 下面为一个线性布局, 其中包括一个ImageViewTextView,最下面仍是一个线性布局, 包括两个Button和两个TextView。

2.1.2功能实现欢迎界面由按钮和图片等构成, 启动该客户端时, 首先进入该界面。

在欢迎界面点击登录按钮可通过QQ号或微信号登录, 点击注册按钮, 可在联网的情况下注册微信号。

2.2登陆界面图2 登录界面2.2.1 界面布局整体采用RelativeLayout相对布局, 下面仍为一相对布局, 其中包括一个Buttton 和一个TextView.紧邻为两个EditText,最下面为相对布局, 包括两个Button。

2.2.2 功能实现使用UserEdit.getText().toString().trim() 和PasswordEdit.getText(). toString().trim()方法得到用户输入的用户名和密码。

安卓课程设计报告

安卓课程设计报告

安卓课程设计报告引言在当今数字化的时代,移动应用的发展变得越来越重要。

安卓操作系统作为最受欢迎的移动操作系统之一,为开发人员提供了广阔的创作空间。

本报告将详细介绍我们小组在安卓课程设计中的设计思路、开发过程和项目成果。

一、项目背景移动应用的普及使得人们在手机上执行各种任务变得越来越方便。

鉴于此,我们小组决定开发一款名为“Daily Planner”的日程管理应用。

该应用旨在帮助用户更加高效地管理个人和工作日程,提高生活的规划和安排能力。

二、需求分析1. 功能需求- 日程管理:用户可以创建、编辑和删除日程,并设置提醒。

- 分类管理:用户可以按照分类将日程划分,如工作、学习、娱乐等。

- 日程分享:用户可以将日程分享给其他用户,方便共享安排。

- 备忘录功能:用户可以添加备忘录,例如购物清单、想法记录等。

- 数据备份:用户可以将日程数据进行备份和恢复。

2. 非功能需求- 用户友好性:用户界面设计简洁明了,操作简单直观。

- 性能要求:应用响应速度快,稳定性高。

- 安全性:用户数据加密存储,保障用户隐私。

三、系统设计和开发我们小组采用了敏捷开发方法,将整个项目分为多个迭代阶段。

每个迭代阶段都有相应的目标和任务,以确保项目在时间和质量上的有效管理。

1. 技术选型为了实现项目需求,我们选择了Java作为主要的开发语言,使用Android Studio作为集成开发环境。

此外,我们还使用了SQLite 作为本地数据库存储数据。

2. 界面设计我们注重用户体验,将界面设计简洁明了。

主界面呈现日历视图,用户可以直观地查看每日计划。

通过侧边菜单,用户可以快速切换到不同的功能模块,如日程管理、备忘录等。

3. 后台开发为了实现日程管理、分类管理等功能,我们设计了相应的后台逻辑。

我们使用SQLite作为本地数据库存储用户数据,并通过查询和更新操作实现不同的功能需求。

四、系统测试与优化在开发过程中,我们注重系统的稳定性和性能。

我们采用了自动化测试框架对系统进行测试,以确保功能的正确性。

安卓开发课程设计报告

安卓开发课程设计报告

安卓开发课程设计报告一、课程目标知识目标:1. 学生理解安卓应用开发的基本概念和原理,掌握安卓开发环境搭建方法。

2. 学生掌握安卓应用的基本组件,如Activity、Service、BroadcastReceiver 等,并了解其生命周期。

3. 学生学会使用安卓布局和控件,能够设计美观、易用的用户界面。

4. 学生掌握安卓事件处理机制,能够实现应用内的交互功能。

5. 学生了解安卓存储和数据持久化的方法,能够实现数据的保存和读取。

技能目标:1. 学生能够独立搭建安卓开发环境,并熟练使用相关工具进行开发。

2. 学生具备编写、调试和优化安卓应用的能力,能够解决实际开发过程中遇到的问题。

3. 学生能够运用所学知识,设计并实现具有实际意义的小型安卓应用。

4. 学生学会查阅安卓开发相关资料,具备自我学习和持续提升的能力。

情感态度价值观目标:1. 学生培养对计算机科学的兴趣,激发创新意识和探索精神。

2. 学生养成合作学习和解决问题的习惯,提高团队协作能力。

3. 学生认识到编程对于培养逻辑思维和抽象思维能力的重要性,增强自信心。

4. 学生了解安卓应用在实际生活中的应用,认识到科技对生活的改变,培养社会责任感。

本课程旨在通过安卓开发教学,使学生在掌握基本知识、技能的基础上,培养实际开发能力,激发创新意识,提高团队协作能力,为未来进一步学习计算机科学和从事相关领域工作打下坚实基础。

二、教学内容1. 安卓开发基础- 环境搭建:讲解并实践安装Java开发工具、Android Studio和模拟器。

- 应用结构:介绍Android应用的基本目录结构,理解AndroidManifest.xml 文件的作用。

2. 安卓应用组件- Activity:学习Activity的生命周期,掌握状态保存和恢复。

- Service:了解Service的基本用法,实现后台服务。

- BroadcastReceiver:学习广播接收者的使用,实现应用间的消息传递。

安卓android课程设计报告

安卓android课程设计报告

湘潭大学课程设计报告课程名称______手机安卓开发_______课题名称______天气预报APP_______指导老师______周唯___________姓名____黄柳________班级____12计2班________小组______棒棒糖_______时间____2015年1月26 日_____一、需求分析(一)引言1.编写目的1.1为用户提供一个显示天气预报的软件,可以根据百度地图显示用户需求的城市位置,以及用图标表示各城市对应的气象信息,可以简洁的表示出“晴、雨、雪”和“气温”气象信息。

2.项目风险2.1(项目风险识别是指找出影响项目目标顺利实现的主要风险因素,并识别出这些风险究竟有哪些基本特征、可能会影响到项目的那些方面。

)2.2联网收费视用户电话运营商的收费标准决定2.3手机或者无线信号不好时,可能无法连接或更新天气情况3.预期读者和阅读建议3.1预期读者:会使用已经安装安卓系统的手机或者平板电脑及其他移动设备的用户3.2阅读建议:读者应通过该文档可以了解相关项目的需求分析、使用注意事项以及可能存在的风险4.产品范围2.2手机,平板电脑,MP4,导航仪,上网本,电纸书等使用安卓系统的数码领域(二)综合描述1.产品的状况1.1 Android是一种以Linux为基础的开放源代码操作系统,主要使用于便携设备。

目前未有统一中文名称,中国大陆地区较多人使用“安卓”或“安致”。

Android操作系统最初由Andy Rubin开发,最初主要支持手机。

2005年由Google收购注资,并组建开放手机联盟开发改良,逐渐扩展到平板电脑及其他数码领域上。

我们开发的相关项目正是一个在安卓平台上开发的软件,可以用这个软件来实现用户在一些简单的手持设备如手机或者平板电脑等上面及时的了解到用户所在城市的天气预报。

2.产品的功能2.1天气信息获取2.2天气信息显示3.系统配置功能3.1用户类和特性安卓平台用户:安卓新用户可以使用软件来了解用户所在城市的天气预报。

Android课程设计报告

Android课程设计报告

2016~2017(1) 《Android程序设计》期末考查设计、实现、使用文档考查题目:订餐外卖系统一、题目要求本程序目的是设计一个校内的订餐系统,旨在方便大众。

总所周知,外卖对于大学生快节奏生活必不可少,大学生通过订外卖可以增加时间的利用率,以及方便了大学生的生活。

本系统具备的功能大体有:订餐、查询店家电话与地址、为店家打分等功能。

二、本实验环境前台:Myeclipse10、eclipse服务器:tomcat6数据库:mysql5.5测试使用手机:酷派手机适用ANDROID 4.2三、程序的设计○1数据库表的设计四、程序的实现(界面设计等将不具体给出过程,给出关键代码)○1服务器端:建立DB_Conn的一个类,其中包含数据库连接函数ConnectDB。

成员包括:driverName//驱动程序名userName//数据库用户名userPassword//数据库用户密码dbName="weborderdb"url//数据库连接字符串conn//数据库连接对象sm//数据库语句对象public void ConnectDB(){try{Class.forName(driverName).newInstance();//实例化conn=DriverManager.getConnection(url,userName,userPassword );//获得数据库连接sm=conn.createStatement();System.out.println("connect success");}catch(Exception e){e.printStackTrace();out.print("数据库连接失败!");}}创建HttpServlet响应客户端发来请求:String username = request.getParameter("account");String password = request.getParameter("password");创建Dao来对mysql数据库进行更新操作:String sql = "select * from tb_admin";rs = db_conn.sm.executeQuery(sql);○2客户端:数据传输相关:通过用HttpUtil连结数据库,用queryStringForPost根据url获得HttpPost的对象,确认是否连接上服务器。

安卓课程设计报告

安卓课程设计报告

安卓课程设计报告设计题目:五子棋目录一.需求分析 (2)二.功能模块 (2)三. 界面设计 (3)四. 分工说明 (5)五. 所遇到的问题 (5)六.代码注释 (6)一.需求分析网络技术的日新月异让世界惊叹,高速发展的网络技术和日渐成熟的3G网络,让越来越多的用户沉浸在手机的世界而无限欢快。

不管是逛街、乘地铁,还是吃饭,排队,跟随潮流的时尚一群都利用拇指掌控着周围的一切,似乎只有手机才能让他们真正体验娱乐的极致。

手机已然成为本世纪最有作为、最受欢迎的发明。

而手机的流行更成就了相关应用和网站,让他们在移动互联网大放异彩的当下备受用户关注。

二.功能模块三. 界面设计3.1开始界面3.2游戏界面3.3点击认输界面四. 分工说明张哲:编辑main代码刘凯:获取MainAct丁章华:写报告黄思淳:程序注释叶浩:编辑MyView代码五. 所遇到的问题1 登录界面的部分功能没有实现。

2 界面的布局没有很清晰。

3 部分代码不够简洁。

六.代码注释public MyView(Context context,float width,float height) {super(context);// TODO Auto-generated constructor stubthis.width=(float) (width);this.height=(float) (height);flag=true;holder=this.getHolder();this.setFocusable(true);holder.addCallback(this);bitmap=BitmapFactory.decodeStream(getResources().openRawResource(R.drawab le.chess_2));chess=new int[9][9];msg="点击开始";}public void myDraw(){//获得画布Canvas canvas=holder.lockCanvas();//获得画笔Paint paint=new Paint();//绘画paint.setAntiAlias(true);Matrix matrix=new Matrix();int ww = bitmap.getWidth();//获取资源位图的宽int hh = bitmap.getHeight();//获取资源位图的高float w = (width/(float)ww);float h = (float) ((height/(float)hh)/1.1);matrix.postScale(w, h);//获取缩放比例Bitmap bmp = Bitmap.createBitmap(bitmap, 0, 0, ww, hh, matrix, true);//根据缩放比例获取新的位图canvas.drawBitmap(bmp, 0, 0, paint); //在屏幕上画出位图int sx=(int) width;int sy=(int) (height/1.1);paint.setColor(Color.BLACK);//适应屏幕画横线竖线tempy=(float) ((0.6*sy-(0.6*sy)%8-16)/8);ax=(sx-tempy*8)/2;ay=(float) (((0.6*sy)%8)/2)+8;bx=sx-(sx-tempy*8)/2;cy=(float) (0.6*sy-((0.6*sy)%8)/2-8);// System.out.println("MyView:==========="+tempy);for(int i=0;i<9;i++){canvas.drawLine(ax, ay+tempy*i, bx, ay+tempy*i, paint);canvas.drawLine(ax+tempy*i, ay, ax+tempy*i, cy, paint);}//画棋盘下方现实信息paint.setColor(Color.BLACK);paint.setTextSize(30);// float tx=3*sx/8;// float ty=(float) (0.75*sy);canvas.drawText(msg, 3*sx/8-25, (float) (0.72*sy), paint);canvas.drawText("开始", (float) (0.175*sx), (float) (0.92*sy), paint);canvas.drawText("认输", (float) (0.425*sx), (float) (0.92*sy), paint);canvas.drawText("退出", (float) (0.675*sx), (float) (0.92*sy), paint);//画棋子int qx,qy;for(int i=0;i<9;i++){for(int j=0;j<9;j++){//画黑棋if(chess[i][j]==1){qx=(int) (ax+i*tempy);qy=(int) (ay+j*tempy);paint.setColor(Color.BLACK);canvas.drawCircle(qx, qy, tempy/3, paint);}//画白棋else if(chess[i][j]==2){qx=(int) (ax+i*tempy);qy=(int) (ay+j*tempy);paint.setColor(Color.WHITE);canvas.drawCircle(qx, qy, tempy/3, paint);}}}if(canvas!=null){holder.unlockCanvasAndPost(canvas);}}Overridepublic boolean onTouchEvent(MotionEvent event) { // TODO Auto-generated method stubsuper.onTouchEvent(event);x=(int) event.getX();y=(int) event.getY();float xx=event.getX();float yy=event.getY();System.out.println("点击的坐标:"+xx+":"+yy);int sx=(int) width;int sy=(int) (height/1.1);//点击开始if(x>=0.125*sx&&x<=0.375*sx&&y>=0.86*sy&&y<=0.98*sy) {game_start=true;msg="黑方落子";myDraw();}//点击认输if(x>0.375*sx&&x<=0.625*sx&&y>=0.86*sy&&y<=0.98*sy) {game_start=false;if(isBlack)msg="黑方认输";else if(!isBlack)msg="白方认输";myDraw();}//点击退出if(x>0.625*sx&&x<=0.875*sx&&y>=0.86*sy&&y<=0.98*sy) {System.exit(0);}else if(game_start){if(x>=ax&&y>=ay&&(x<=bx+tempy)&&y<=(cy+tempy)){x=(int) ((x-ax)/tempy);y=(int) ((y-ay)/tempy);System.out.println("变换成下标后xy的值:"+x+":"+y);if(chess[x][y]==0){//黑方下棋if(isBlack){chess[x][y]=1;isBlack=false;msg="白方落子";}//白方下棋else{chess[x][y]=2;isBlack=true;msg="黑方落子";}boolean isWin=checkWin(x,y);if(isWin){if(isBlack==false){msg="黑方获胜";game_start=false;}else if(isBlack==true){msg="白方获胜";game_start=false;}}}myDraw();}}return true; }。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

滨江学院《Android》课程设计报告题目飞翔的圆(类似Flappy Bird)专业_ _学生姓名_____ _ ____ __学号_ _二O一五年六月二十五日目录一安卓应用程序开发背景 (3)1.1开发背景 (3)1.2开发环境 (4)二安卓应用程序开发理论与方法 (4)三小游戏应用程序的设计与实现 (6)3.1 拟解决的问题及目标 (6)3.2 总体设计 (5)3.3 详细设计与编码实现 (6)四总结 (17)一安卓应用程序开发背景1.1开发背景1.智能手机的市场(1)功能多样化的智能手机挑战全球PC出货量移动互联网时代的来临,直接促进了搭载智能操作系统、具有强大扩展性的智能手机、平板电脑等移动终端产业的蓬勃发展。

来自美国最大的风险投资机构KPCB的数据显示,全球智能手机出货量正在以远高于台式电脑、笔记本电脑出货量的速度快速增长,该机构预计2011年全球智能手机出货量将达到4.13亿,超过台式电脑与笔记本电脑出货量的总和。

(2)智能手机的用户使用数量正在高速增长。

据市场调研机构Gartner信息,2011年全球智能手机的总出货量将会达到4.68亿部,相比2010年实现了57.7%的增长,而谷歌Android 操作系统将会在今年之内成为全球最大的智能手机操作系统。

另外,全球市场调研机构IDC 预计未来5年中国手机市场上,智能手机替代传统功能手机的趋势将日益明显,未来5年中国智能手机市场复合增长率将达到34.1%,人们对IT设备智能化的向往是这一增长率能够实现的主要因素,并且与其他国家相比,中国智能手机市场的发展空间更加广阔。

(3)操作系统格局预测:Android有望成为智能手机市场主导力量搭载Android操作系统的智能手机目前已经成为市场上最炙手可热的智能产品。

来自美国市场研究机构Gartner的数据显示,Android操作系统所占的市场份额从2008年的0.5%急剧增长到2011年的15.94%。

开放的源代码和零成本已经让Android在全世界范围内受到青睐并迅速获得了主要手机厂商和数百万软件开发者的支持,Gartner预计,未来Android 系统的市场份额有望超过其他操作系统,从而成为全球第一大智能手机操作系统。

2.安卓手机介绍安卓手机指的是用Android操作系统的手机。

安卓(Android)是基于Linux内核的操作系统,是Google公司在2007年11月5日公布的手机操作系统。

同样都是手机上面用的智能系统,安卓的系统是新生系统,界面更为华丽,开源性更强,当然因为是新生系统,所以在第三方软件方面暂时还不太多。

因此,安卓应用程序的需求还是很迫切的。

3.软件人才需求据业内统计,目前国内的Android研发人才缺口至少30万。

由于目前Android技术较新,无论是相关书籍、培训还是大学教育,都处于初级阶段,因此Android人才短期将供不应求。

从长期来看,随着各种移动应用和手机游戏等内容需求日益增加,也将激励大中小型手机应用开发商加大对Android应用的开发力度,因此Android人才的就业前景也非常广泛。

综上所述,在这样的背景下,安卓有很强的生命力。

同时,作为一个新生的系统,其应用程序目前并不多,安卓应用程序的需求还是很迫切的,安卓研发人才的缺口还很大。

这些都促进了我们学习开发安卓应用程序。

1.2开发环境安卓应用程序开发环境如下:①JDK 5 or JDK 6 (JRE alone is not sufficient)②Eclipse 3.3 (Europa), 3.4 (Ganymede)③Android SDK④ADT 0.8.0⑤Eclipse安装ADT 插件二安卓应用程序开发理论与方法1、Activity的相关知识简单理解Activity 代表一个用户所能看到的屏幕,Activity 主要是处理一个应用的整体性工作。

Activity是最基本的Android 应用程序组件,应用程序中,一个活动通常就是一个单独的屏幕。

每一个活动都被实现为一个独立的类,并且从活动基类中继承而来,活动类将会显示由视图控件组成的用户接口,并对事件做出响应。

大多数的应用是由多个屏幕显示组成,因而要用到多个Activity。

(1)Activity的相关方法及相关函数:A、void onCreate(Bundle)首次启动时调用,接受参数:Null or savedInstanceState(保存的以前某些状态信息)B、void onStart()说明了将要显示给用户的活动C、void onRestart()将处于停止状态的活动重新显示给用户D、void onResume()用户可以开始与活动进行交互时调用。

如动画播放和音乐播放。

E、void onPause()活动将要进入后台运行时调用。

(此时前台启动了另一个活动)F、void onStop()不需要某个活动了,就调用G、void onDestroy()销毁活动(2)多个Activity之间的跳转:通过Intent类实现屏幕之间的跳转(包括没有参数关系和需要传递参数两种情况)。

(3)两个Activity之间进行数据交换:startActivity() 只有Intent一个参数。

public void startSubActivity(Intent intent, int requestCode)(requestCode:用来标识某一个调用,一般定义一个常量。

)传过去:函数原型为: public Intent setData(ContentURI data) 然后,参数带到新的Activity后,同样用Activity.getIntent()函数可得到当前过来的Intent 对象,然后用getData()就取到参数了。

传回来:函数原型为: public final void setResult(int resultCode, String data) 2、Intent的相关知识Intent 是描述应用想要做什么。

Android 使用了Intent 这个特殊类,实现在屏幕与屏幕之间移动。

Intent 数据结构两个最重要的部分是动作和动作对应的数据。

Intent类绑定一次操作,它负责携带这次操作所需要的数据以及操作的类型等。

3、Layout用于用户界面设计。

包含AbsoluteLayout, FrameLayout,GridView, LinearLayout,ListLayout, RadioGroup, TableLayout等等。

在本程序中用到的有:(1)线性布局LinearLayout垂直:android:orientation="vertical“水平:android:orientation="horizontal"(2)相对布局RelativeLayout让子元素指定它们相对于其他元素的位置(通过ID 来指定)或相对于父布局对象。

在RelativeLayout布局里的控件包含丰富的排列属性:Layout above:控件在指定控件的上方Layout below:控件在指定控件的下方Layout to left of……三小游戏应用程序的设计与实现3.1 拟解决的问题及目标本游戏上手简单,主旨在让人在紧张的生活中,获得游戏的乐趣,程序要实现的目标有如下几个:(1)界面流畅(2)有当前得分(3)有最高得分(4)后点击界面重新开始游戏3.2 总体设计1、游戏的操作流程点击屏幕即可开始,当出现游戏界面是,通过点击屏幕控制圆点的高度,使得圆点触碰不到上下两边的长方形。

3.3 详细设计与编码实现1、游戏界面开始界面,点击屏幕圆点自动向前移动当前得分0,点击屏幕控制圆点高度触碰到长方形,游戏结束,点击屏幕重新开始2、核心代码如下:GameBirdActivity类public class GameBirdActivity extends Activity {public static GameBirdActivity instance;private LinearLayout gameView;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);instance = this;this.getWindow().setFlags(youtParams.FLAG_FULLSCREEN, youtParams.FLAG_FULLSCREEN);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(yout.content_view);//gamegameView = (LinearLayout)this.findViewById(R.id.game_view);gameView.addView(new GameBirdSurfaceView(this));}public void showMessage(int level){saveSettingData(level);Intent intent = new Intent(this, LoadingActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);}public static final String GameBirdSettingsFile = "GameBird_Settings";public static final String Settings_LevelLast = "LevelLast";public static final String Settings_LevelTop = "LevelTop";private void saveSettingData(int level) {SharedPreferences gb_settings = getSharedPreferences(GameBirdSettingsFile, 0);gb_settings.edit().putInt(Settings_LevelLast, level).commit();int top = gb_settings.getInt(Settings_LevelTop, 0);if(level>top){gb_settings.edit().putInt(Settings_LevelTop, level).commit();}}}GameBirdSurfaceView类public class GameBirdSurfaceView extends SurfaceView implements Callback, Runnable {private SurfaceHolder sfh;private Paint paint;private Thread th;private boolean flag;private Canvas canvas;private static int screenW, screenH;private static final int GAME_MENU = 0;private static final int GAMEING = 1;private static final int GAME_OVER = -1;private static int gameState = GAME_MENU;private int[] floor = new int[2];private int floor_width = 15;private int speed = 3;private int[] level = new int[2];private int level_value = 0;private int[] bird = new int[2];private int bird_width = 10;private int bird_v = 0;private int bird_a = 2;private int bird_vUp = -16;private ArrayList<int[]> walls = new ArrayList<int[]>();private ArrayList<int[]> remove_walls = new ArrayList<int[]>(); private int wall_w = 50;private int wall_h = 100;private int wall_step = 30;public GameBirdSurfaceView(Context context) {super(context);sfh = this.getHolder();sfh.addCallback(this);paint = new Paint();paint.setColor(Color.WHITE);paint.setAntiAlias(true);paint.setTextSize(50);paint.setStyle(Style.STROKE);setFocusable(true);setFocusableInTouchMode(true);this.setKeepScreenOn(true);}public void surfaceCreated(SurfaceHolder holder) {screenW = this.getWidth();screenH = this.getHeight();initGame();flag = true;th = new Thread(this);th.start();}private void initGame() {if (gameState == GAME_MENU) {floor[0] = 0;floor[1] = screenH - screenH/5;level[0] = screenW/2;level[1] = screenH/5;level_value = 0;bird[0] = screenW/3;bird[1] = screenH/2;walls.clear();floor_width = dp2px(15);speed = dp2px(3);bird_width = dp2px(10);bird_a = dp2px(2);bird_vUp = -dp2px(16);wall_w = dp2px(45);wall_h = dp2px(100);wall_step = wall_w*4;}}private int dp2px(float dp){int px = Math.round(TypedValue.applyDimension(PLEX_UNIT_DIP, dp, getResources().getDisplayMetrics()));return px;}public void myDraw() {try {canvas = sfh.lockCanvas();if (canvas != null) {//clearcanvas.drawColor(Color.BLACK);//backgroundint floor_start = floor[0];while(floor_start<screenW){canvas.drawLine(floor_start, floor[1], floor_start+floor_width, floor[1], paint);floor_start += floor_width*2;}//wallfor (int i = 0; i < walls.size(); i++) {int[] wall = walls.get(i);float[] pts = {wall[0],0,wall[0],wall[1],wall[0],wall[1]+wall_h,wall[0],floor[1],wall[0]+wall_w,0,wall[0]+wall_w,wall[1],wall[0]+wall_w,wall[1]+wall_h,wall[0]+wall_w,floor[1],wall[0],wall[1], wall[0]+wall_w, wall[1],wall[0],wall[1]+wall_h, wall[0]+wall_w, wall[1]+wall_h};canvas.drawLines(pts, paint);paint);floor[1], paint);}//birdcanvas.drawCircle(bird[0], bird[1], bird_width, paint);//levelcanvas.drawText(String.valueOf(level_value), level[0], level[1], paint);}} catch (Exception e) {} finally {if (canvas != null)sfh.unlockCanvasAndPost(canvas);}}public boolean onTouchEvent(MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_DOWN){switch (gameState) {case GAME_MENU:gameState = GAMEING;//bird_v = bird_vUp;//break;case GAMEING:bird_v = bird_vUp;break;case GAME_OVER://bird downif(bird[1] >= floor[1] - bird_width){gameState = GAME_MENU;initGame();}break;}}return true;}public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK) {GameBirdActivity.instance.finish();System.exit(0);return true;}return super.onKeyDown(keyCode, event);}private int move_step = 0;private void logic() {switch (gameState) {case GAME_MENU:break;case GAMEING://birdbird_v+=bird_a;bird[1] += bird_v;if(bird[1] > floor[1] - bird_width){bird[1] = floor[1] - bird_width;gameState = GAME_OVER;}//top//if(bird[1]<=bird_width){//bird[1]=bird_width;//}//floorif(floor[0] < -floor_width){floor[0] += floor_width*2;}floor[0] -= speed;//wallremove_walls.clear();for (int i = 0; i < walls.size(); i++) {int[] wall = walls.get(i);wall[0] -= speed;if(wall[0]<-wall_w){remove_walls.add(wall);}elseif(wall[0]-bird_width<=bird[0]&& wall[0]+wall_w+bird_width>=bird[0] &&(bird[1]<=wall[1]+bird_width||bird[1]>=wall[1]+wall_h-bird_width)){gameState = GAME_OVER;}int pass = wall[0]+wall_w+bird_width-bird[0];if(pass<0 && -pass<=speed){level_value++;}}//out of screenif(remove_walls.size()>0){walls.removeAll(remove_walls);}//new wallmove_step += speed;if(move_step>wall_step){int[] wall = new int[]{screenW, (int)(Math.random()*(floor[1]-2*wall_h)+0.5*wall_h)};walls.add(wall);move_step = 0;}break;case GAME_OVER://birdif(bird[1] < floor[1] - bird_width){bird_v+=bird_a;bird[1] += bird_v;if(bird[1] >= floor[1] - bird_width){bird[1] = floor[1] - bird_width;}}else{GameBirdActivity.instance.showMessage(level_value);gameState = GAME_MENU;initGame();}break;}}public void run() {while (flag) {long start = System.currentTimeMillis();myDraw();logic();long end = System.currentTimeMillis();try {if (end - start < 50) {Thread.sleep(50 - (end - start));}} catch (InterruptedException e) {e.printStackTrace();}}}public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}public void surfaceDestroyed(SurfaceHolder holder) {flag = false;}}LoadingActivity类public class LoadingActivity extends Activity {public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);this.getWindow().setFlags(youtParams.FLAG_FULLSCREEN, youtParams.FLAG_FULLSCREEN);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(yout.loading);final TextView gameStart = (TextView)findViewById(R.id.game_start);AdView adView = (AdView)findViewById(R.id.adView);adView.setAdListener(new AdListener() {public void onReceiveAd(Ad arg0) {gameStart.setVisibility(View.VISIBLE);}public void onPresentScreen(Ad arg0) {// TODO Auto-generated method stub}public void onLeaveApplication(Ad arg0) {// TODO Auto-generated method stub}public void onFailedToReceiveAd(Ad arg0, ErrorCode arg1) {// TODO Auto-generated method stub}public void onDismissScreen(Ad arg0) {// TODO Auto-generated method stub}});View gameMessage = findViewById(R.id.GameMessage);int[] data = getSettingData();TextView levelMessage = (TextView)findViewById(R.id.level_Message);levelMessage.setText("SCORE: "+data[0]+"\nBEST: "+data[1]);gameMessage.setOnClickListener(new View.OnClickListener() {public void onClick(View arg0) {Intent intent = new Intent(LoadingActivity.this, GameBirdActivity.class);intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);startActivity(intent);finish();}});}private int[] getSettingData() {SharedPreferences gb_settings = getSharedPreferences(GameBirdActivity.GameBirdSettingsFile, 0);int last = gb_settings.getInt(GameBirdActivity.Settings_LevelLast, 0);int top = gb_settings.getInt(GameBirdActivity.Settings_LevelTop, 0);return new int[]{last, top};}public boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) {try{GameBirdActivity.instance.finish();}catch(Exception e){}finish();System.exit(0);return true;}return super.onKeyDown(keyCode, event);}}四总结在本次开发过程中,我对开发环境进一步的熟悉,基本上可以熟练运用这个环境,也基本掌握了安卓的开发方法及基本流程。

相关文档
最新文档