当前位置:  编程技术>移动开发
本页文章导读:
    ▪【物理解谜】小弟我的鱼:Oh my fish        【物理解谜】我的鱼:Oh my fish转载自:http://www.iapps.im/archives/35153#jtss-tqq ps: 本文并非我所原创,不过我是这个游戏的开发商之一~ 归类为原创有两个原因,作者见到还请海涵: 1。原创方能.........
    ▪ 利用Shared Preferences兑现用户本地登录        利用Shared Preferences实现用户本地登录Android中四种数据存储方式, Shared Preferences主要是以键值对的形式来存储数据,他仅仅是轻量级存储机制,主要实现android比较简单参数的设置。这里主要.........
    ▪ 基于mjpg-streamer-r63的源码分析之:基础知识详细解释[2]       基于mjpg-streamer-r63的源码分析之:基础知识详细解释[二] *************************************************************************************************************************** 作者:EasyWave                       .........

[1]【物理解谜】小弟我的鱼:Oh my fish
    来源: 互联网  发布时间: 2014-02-18
【物理解谜】我的鱼:Oh my fish

转载自:http://www.iapps.im/archives/35153#jtss-tqq

ps:

本文并非我所原创,不过我是这个游戏的开发商之一~

归类为原创有两个原因,作者见到还请海涵:

1。原创方能发布到 csdn 主页,让大家都能过来给捧捧场~

2。本月原创博文有限,想保住 “持之以恒” 的勋章~

$0.99  限时免费 大小: 9.3 MB 系统: 4.3+

感谢 大花是个好少年 在 爱分享 中留言分享!

App简介:

刚上手把玩时,还有点切绳子之感,不过当小编渐渐深入游戏,发现还是有可圈可点的新意所在。因为在此游戏中,开发商灵活运用了“冰块”这个元素。它可能是阻止你的障碍,可能是给予你动能的助力,也可能是帮你铺垫崎岖道路的基石,灵活多变!推荐给喜爱物理益智解谜的朋友试试咯。

在游戏中,玩家需要手划直线对冰块,绳子等物体进行切割,当把大鱼运送到白熊君的鸭子船上时即可过关。有些关卡中需要活用不同形状的冰块,比如在一些关卡中地面凹凸不平有缺陷,就需要切

App截图:

App下载地址:

备用下载地址(来自www.iapps.im)



    
[2] 利用Shared Preferences兑现用户本地登录
    来源: 互联网  发布时间: 2014-02-18
利用Shared Preferences实现用户本地登录

Android中四种数据存储方式, Shared Preferences主要是以键值对的形式来存储数据,他仅仅是轻量级存储机制,主要实现android比较简单参数的设置。这里主要利用其中一种即Shared Preferenced来实现本地用户登录,下面是效果图:

这时我们可以设置用户名和密码。

然后,当我们下次在打开软件的时候,即出现下面登录的效果:

点击确定之后我们就可以进入下一层显示。Shared Preference主要是以getPreference()方法获取对象,然后再通过Editor来设置里面键值对形式的参数,最后再通过commit方法来提交保存这些数据,这些数据无法共享,即无法直接在多个程序间共享Preference数据。下面是上面效果的主要源码:

public class MainActivity extends Activity {

    private	AlertDialog setPrefernAlertDialog;
    private AlertDialog showPasswordDialog;
    private  boolean isFirst;
    //保存数据 专用
    private SharedPreferences sp;
    private EditText safenumber;
    private TelephonyManager tm;
    private Button  start_button,modify_button;
    private boolean isStart;
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        sp=this.getSharedPreferences("data",MODE_WORLD_READABLE);  
        //主要以键值对的形式取出
       isFirst=sp.getBoolean("first", true);
       //若值没设置 则开始设置密码一类
       if (isFirst)
  	{
  		showSetPasswordDialog();
  		return;
  	}else {
  		
  		showInputPasswordDialog();
  	  }
       
    }
    public void init()
    {
    	setContentView(R.layout.activity_main);	
    	
    }

      //第一次使用 创建弹出输入密码对话框 属于dialog的基本操作 
      private void showSetPasswordDialog()
      {
      	AlertDialog.Builder builder=new AlertDialog.Builder(this);
          //给Dialog设置View 从XML文件转换而来 这是属于基本操作
      	 LayoutInflater inflater=LayoutInflater.from(this); 
          View view=	inflater.inflate(R.layout.show_password_dialog,null);
          final EditText	username =(EditText)view.findViewById(R.id.username);
          final EditText  userpassword=(EditText)view.findViewById(R.id.password);
          
          
          Button ok=(Button)view.findViewById(R.id.ok);
          Button cancle=(Button)view.findViewById(R.id.cancle);
          //设置动作
          ok.setOnClickListener(new OnClickListener()
  		{
  			
  			@Override
  			public void onClick(View v)
  			{
  				// TODO Auto-generated method stub
  				String name=username.getText().toString();
  				String password=userpassword.getText().toString();
  				//设置密码时 判断两者不能为空
  				if(name.trim().equals("") || password.trim().equals("")) {
  					Toast.makeText(MainActivity.this, "用户名和密码不能为空", Toast.LENGTH_LONG).show();
  					 return;
  				}
  				//sharedpreferences的基本操作 以键值对的形式保存到data文件中
  			    Editor editor=sp.edit();
  			    editor.putString("name",name);
  			    editor.putString("password",password);
  				editor.putBoolean("first", false);
  				//提交保存到生成的XML文件中
  				editor.commit();
  				setPrefernAlertDialog.dismiss();
  				init();
  				
  			}
  		});
          cancle.setOnClickListener(new OnClickListener()
  		{
  			
  			@Override
  			public void onClick(View v)
  			{
  				// TODO Auto-generated method stub
  				//这里注意要消去 对话框 再finish掉Activity 否则 有bug
  				if (isFirst)
  				{
  					setPrefernAlertDialog.dismiss();
  					MainActivity.this.finish();
  				}
  				setPrefernAlertDialog.dismiss();
  				
  			}
  		});
          
          
      	builder.setTitle("请设置密码");
      	builder.setView(view);
          setPrefernAlertDialog=builder.create();
          setPrefernAlertDialog.show();
     
      }
      /*
       * 当不是第一次操作,即已经设置完密码之后的操作
       */
         
      public void   showInputPasswordDialog()
      {
    	   AlertDialog.Builder builder = new AlertDialog.Builder(this);
    		
    		LayoutInflater inflater = LayoutInflater.from(this);
    		View view = inflater.inflate(R.layout.show_password_dialog, null);
    		final EditText et_username = (EditText) view.findViewById(R.id.username);
    		final EditText et_password = (EditText) view.findViewById(R.id.password);
    		
    		Button btn_ok = (Button) view.findViewById(R.id.ok);
    		Button btn_cancle = (Button) view.findViewById(R.id.cancle);
    		
    		btn_ok.setOnClickListener(new OnClickListener() {

    			public void onClick(View v) {
    				String name = et_username.getText().toString();
    				String password = et_password.getText().toString();
    				
    				if(name.trim().equals("") || password.trim().equals("")) {
    					Toast.makeText(MainActivity.this, "用户名和密码不能为空", Toast.LENGTH_LONG).show();
    					return;
    				}
    				//获取保存文件中的用户名和密码 
    				String savedUsername = sp.getString("name", "");
    				String savedPassword = sp.getString("password", "");
    				//查看输入的密码和名字是否一致 
    				if(name.trim().equals(savedUsername) && password.trim().equals(savedPassword)) {
    					init();
    					showPasswordDialog.dismiss();
    				} else {
    					Toast.makeText(MainActivity.this, "用户名或者密码错误", Toast.LENGTH_LONG).show();
    					return;
    				}
    				
    			}});
    		//下面属于基本的操作 
    		btn_cancle.setOnClickListener(new OnClickListener() {

    			public void onClick(View v) {
    				showPasswordDialog.dismiss();
    				MainActivity.this.finish();
    				
    			}});
    		
    		builder.setTitle("输入密码");
    		builder.setView(view);
    		showPasswordDialog = builder.create();
    		showPasswordDialog.show();

      }

}


上面最基本的一些含义已经注释了,记住一点就是这点:

//这里注意要先消去对话框 再finish掉Activity 否则 有bug

 if (isFirst)

{ setPrefernAlertDialog.dismiss();

 MainActivity.this.finish(); }

下面是show_password_dialog.xml:

 

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <EditText 
     android:id="@+id/username"
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"   
     android:hint="请输入用户名 :"   
        />
    <EditText 
     android:id="@+id/password"   
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:password="true"   
     android:hint="请输入用户密码:"   
        />
<LinearLayout 
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
    <Button 
    android:id="@+id/ok"    
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/ok" 
    android:layout_weight="1"
    android:textSize="20sp"
    android:textColor="@color/purple"
        />
        <Button 
    android:id="@+id/cancle"    
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/cancle" 
    android:layout_weight="1"
    android:textSize="20sp"  
    android:textColor="@color/purple"
 />
</LinearLayout>
</LinearLayout>


    
[3] 基于mjpg-streamer-r63的源码分析之:基础知识详细解释[2]
    来源: 互联网  发布时间: 2014-02-18
基于mjpg-streamer-r63的源码分析之:基础知识详细解释[二]

***************************************************************************************************************************
作者:EasyWave                                                                                 时间:2012.07.28

类别:linux应用之mjpg-streamer分析                                            声明:转载,请保留链接

注意:如有错误,欢迎指正。这些是我学习的日志文章......

***************************************************************************************************************************

在mjpg-streamer的程序中,经常会看到getopt_long_only这个函数,这是一个抓取或者说是解析命令行参数的一个linux下的API函数。主要分为下面几种:

#include <getopt.h>
int getopt_long(int argc, char * const argv[],const char *optstring,const struct option *longopts, int *longindex);
int getopt_long_only(int argc, char * const argv[],const char *optstring,const struct option *longopts, int *longindex);

说明:函数中的argc 和argv 通常直接从main()到两个参数传递而来。optstring 是选项参数组成的字符串,如果该字符串里任一字母后有冒号,那么这个选项就要求有参数。下一个参数是指向数组的指针,这个数组是option 结构数组,option 结构称为长选项表,其声明如下:

struct option {
   const char *name;
   int  has_arg;
   int  *flag;
   int  val;
};


结构中的元素解释如下:

const char *name:选项名,前面没有短横线。譬如"help"、"input"之类。
int has_arg:描述长选项是否有选项参数,如果有,是哪种类型的参数,其值见下表:
                         符号常量                       数值                含义
                         no_argument                 0            选项没有参数
                         required_argument      1            选项需要参数
                         optional_argument       2           选项参数是可选的
int *flag:
如果该指针为NULL,那么getopt_long 返回val 字段的值;如果该指针不为NULL,那么会使得它所指向的结构填入val 字段的值,同时getopt_long返回0
int val:
如果flag 是NULL,那么val 通常是个字符常量,如果短选项和长选项一致,那么该字符就应该与optstring 中出现的这个选项的参数相同;最后一个参数:longindex 参数一般赋为NULL 即可;如果没有设置为NULL,那么它就指向一个变量,这个变量会被赋值为寻找到的长选项在longopts 中的索引值,这可以用于误诊断。


getopt_long()函数使用规则:
(1)使用前准备两种数据结构
字符指针型变量该数据结构包括了所有要定义的短选项,每一个选项都只用单个字母表示。如果该选项需要参数(如,需要文件路径等),则其后跟一个冒号。例如,三个短选项分别为‘-s’‘-h’‘-v’,其中-o 需要参数,其他两个不需要参数。那么,我们可以将数据结构定义成如下形式:
    const char * const shor_options = “sh:v” ;
     struct option 类型数组
该数据结构中的每个元素对应了一个长选项,并且每个元素是由四个域组成。通常情况下,可以按以下规则使用。第一个元素,描述长选项的名称;第二个选项,代表该选项是否需要跟着参数,需要参数则为1,反之为0;第三个选项,可以赋为NULL;第四个选项,是该长选项对应的短选项名称。另外,数据结构的最后一个元素,要求所有域的内容均为0,即{NULL,0,NULL,0}。下面举例说明,该数据结构可以定义成如下形式:

static struct option long_options[] = \
    {
      {"h", no_argument, 0, 0},
      {"help", no_argument, 0, 0},
      {"i", required_argument, 0, 0},
      {"input", required_argument, 0, 0},
      {"o", required_argument, 0, 0},
      {"output", required_argument, 0, 0},
      {"v", no_argument, 0, 0},
      {"version", no_argument, 0, 0},
      {"b", no_argument, 0, 0},
      {"background", no_argument, 0, 0},
      {0, 0, 0, 0}
    };


在mjpg-streamer的主函数main中有这样一段代码如下:

/* parameter parsing */
  while(1) {
    int option_index = 0, c=0;
    static struct option long_options[] = \
    {
      {"h", no_argument, 0, 0},
      {"help", no_argument, 0, 0},
      {"i", required_argument, 0, 0},
      {"input", required_argument, 0, 0},
      {"o", required_argument, 0, 0},
      {"output", required_argument, 0, 0},
      {"v", no_argument, 0, 0},
      {"version", no_argument, 0, 0},
      {"b", no_argument, 0, 0},
      {"background", no_argument, 0, 0},
      {0, 0, 0, 0}
    };

    c = getopt_long_only(argc, argv, "", long_options, &option_index);

    /* no more options to parse */
    if (c == -1) break;

    /* unrecognized option */
    if(c=='?'){ help(argv[0]); return 0; }

    switch (option_index) {
      /* h, help */
      case 0:
      case 1:
        help(argv[0]);
        return 0;
        break;

      /* i, input */
      case 2:
      case 3:
        input = strdup(optarg);
        break;

      /* o, output */
      case 4:
      case 5:
        output[global.outcnt++] = strdup(optarg);
        break;

      /* v, version */
      case 6:
      case 7:
        printf("MJPG Streamer Version: %s\n" \
               "Compilation Date.....: %s\n" \
               "Compilation Time.....: %s\n", SOURCE_VERSION, __DATE__, __TIME__);
        return 0;
        break;

      /* b, background */
      case 8:
      case 9:
        daemon=1;
        break;

      default:
        help(argv[0]);
        return 0;
    }
  }


重点分析一下getopt_long_only 函数:
int getopt_long_only(int argc, char * const argv[],const char *optstring,const struct option*longopts, int *longindex);
该函数每解析完一个选项,就返回该选项字符。如果选项带参数,参数保存在optarg 中。如果选项带可选参数,而实际无参数时,optarg为NULL。当遇到一个不在optstring 指明的选项时,返回字符'?'。如果在optstring 指明某选项带参数而实际没有参数时,返回字符'?'或者字符':',视optstring 的第一个字符而定。这两种情况选项的实际值被保存在optopt 中。当解析错误时,如果opterr 为1 则自动打印一条错误消息(默认),否则不打印。当解析完成时,返回-1。每当解析完一个argv,optind 就会递增。如果遇到无选项参数,getopt 默认会把该参数调后一位,接着解析下一个参数。如果解析完成后还有无选项的参数,则optind 指示的是第一个无选项参数在argv 中的索引。最后一个参数longindex 在函数返回时指向被搜索到的选项在longopts 数组中的下标。longindex 可以为NULL,表明不需要返回这个值

 

 


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3