我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android游戏开发学习之引擎用法实例详解

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android游戏开发学习之引擎用法实例详解

本文实例讲述了Android游戏开发学习之引擎用法。分享给大家供大家参考。具体如下:

汽车引擎是汽车的心脏,其决定了汽车的性能和稳定性,是人们在购车时相当关注的。而游戏中的物理引擎就如汽车的引擎一样,占据了非常重要的位置。一款好的物理引擎可以非常真实地模拟现实世界,使得游戏更加逼真,提供更好的娱乐体验。

一、JBox2D简介

JBox2D是开源物理引擎Box2D的Java版本,可以直接用于Android。由于JBox2D的图形渲染使用的是Processing库,因此在Android平台上使用JBox2D时,图形渲染工作只能自行开发。该引擎能够根据开发人员设定的参数,如重力、密度、摩擦系数和弹性系数等,自动地进行2D刚体物理运动的全方位模拟。

二、示例

1.小球弹跳进阶版

在第1节中小球的下落、碰撞、弹起都是用代码来维护的,下面使用物理引擎来实现,并且加入了刚体之间的碰撞。

(1)常量类Constant


package box2d.bheap; 
public class Constant { 
  public static final float RATE=10; //屏幕与现实世界的比例 
  public static final boolean DRAW_THREAD_FLAG=true; //绘制线程工作标识位 
  public static final float TIME_STEP=2.0f/60.0f; //模拟的频率 
  public static final int ITERA=10; //迭代次数 
  public static int SCREEN_WIDTH; //屏幕宽度 
  public static int SCREEN_HEIGHT; //屏幕高度 
}

(2)抽象类MyBody

该类为自定义的抽象类,是所有自定义刚体类的基类。由于JBox2D中的刚体类对象仅具有物理仿真计算的功能,并没有提供Android平台下的绘制功能,直接使用不是很方便。因此,这里定义了MyBody对自定义刚体的绘制及JBox2D物理仿真对象进行了封装。


package box2d.bheap; 
import org.jbox2d.dynamics.Body; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
public abstract class MyBody { 
  Body body; //JBox2D物理引擎中的刚体  
  int color; //刚体的颜色 
  public abstract void drawSelf(Canvas canvas,Paint paint); //绘制的方法 
}

(3)圆形刚体类MyCircleColor


package box2d.bheap; 
import org.jbox2d.dynamics.Body; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.Paint.Style; 
import static box2d.bheap.Constant.*; //静态导入 
public class MyCircleColor extends MyBody { 
  float radius; //圆形半径 
  public MyCircleColor(Body body,float radius,int color) { 
    this.body=body; 
    this.radius=radius; 
    this.color=color; 
  } 
  @Override 
  public void drawSelf(Canvas canvas, Paint paint) { 
    paint.setColor(color&0xCFFFFFF); //设置颜色 
    float x=body.getPosition().x*RATE; 
    float y=body.getPosition().y*RATE; 
    canvas.drawCircle(x, y, radius, paint); //画圆 
    paint.setStyle(Style.STROKE); //设置空心无填充 
    paint.setStrokeWidth(1); 
    paint.setColor(color); //画边 
    canvas.drawCircle(x, y, radius, paint); 
    paint.reset(); //恢复画笔设置 
  } 
}

(4)矩形刚体类MyRectColor


package box2d.bheap; 
import static box2d.bheap.Constant.RATE; 
import org.jbox2d.dynamics.Body; 
import android.graphics.Canvas; 
import android.graphics.Matrix; 
import android.graphics.Paint; 
public class MyRectColor extends MyBody { 
  float halfWidth;//半宽 
  float halfHeight;//半高 
  public MyRectColor(Body body,float halfWidth,float halfHeight,int color) 
  { 
    this.body=body; 
    this.halfWidth=halfWidth; 
    this.halfHeight=halfHeight;    
    this.color=color; 
  } 
  public void drawSelf(Canvas canvas,Paint paint) 
  {      
    paint.setColor(color&0x8CFFFFFF);  
    float x=body.getPosition().x*RATE; 
    float y=body.getPosition().y*RATE; 
    float angle=body.getAngle(); 
    canvas.save(); 
    Matrix m1=new Matrix(); 
    m1.setRotate((float)Math.toDegrees(angle),x, y); 
    canvas.setMatrix(m1); 
    canvas.drawRect(x-halfWidth, y-halfHeight, x+halfWidth, y+halfHeight, paint);  
    paint.setStyle(Paint.Style.STROKE); 
    paint.setStrokeWidth(1);//设置线条宽度 
    paint.setColor(color); 
    canvas.drawRect(x-halfWidth, y-halfHeight, x+halfWidth, y+halfHeight, paint);  
    paint.reset();    
    canvas.restore(); 
  } 
}

(5)生成刚体形状的工具类Box2DUtil


package box2d.bheap; 
import static box2d.bheap.Constant.RATE; 
import org.jbox2d.collision.CircleDef; 
import org.jbox2d.collision.PolygonDef; 
import org.jbox2d.dynamics.Body; 
import org.jbox2d.dynamics.BodyDef; 
import org.jbox2d.dynamics.World; 
public class Box2DUtil { 
   
  public static MyRectColor createBox ( 
      float x, 
      float y, 
      float halfWidth, 
      float halfHeight, 
      boolean isStatic, //是否为静止的 
      World world, 
      int color 
  ) { 
    PolygonDef shape=new PolygonDef(); //创建多边形描述对象 
    if(isStatic) { 
      shape.density=0; 
    } else { 
      shape.density=1.0f; 
    } 
    shape.friction=0.0f; //设置摩擦系数 
    shape.restitution=0.6f; //设置能量损失率 
    shape.setAsBox(halfWidth/RATE, halfHeight/RATE); 
    BodyDef bodyDef=new BodyDef(); //创建刚体描述对象 
    bodyDef.position.set(x/RATE,y/RATE); //设置位置 
    Body bodyTemp=world.createBody(bodyDef); //在世界中创建刚体 
    bodyTemp.createShape(shape); //指定刚体形状 
    bodyTemp.setMassFromShapes(); //设置物体质量 
    return new MyRectColor(bodyTemp, halfWidth, halfHeight, color);
  } 
   
  public static MyCircleColor createCircle ( 
      float x, 
      float y, 
      float radius, 
      World world, 
      int color 
  ) { 
    CircleDef shape=new CircleDef(); //创建圆描述对象 
    shape.density=2; //设置密度 
    shape.friction=0.0f; //设置摩擦系数 
    shape.restitution=0.95f; //设置能量损失率 
    shape.radius=radius/RATE;//设置半径 
    BodyDef bodyDef=new BodyDef(); //创建刚体描述对象 
    bodyDef.position.set(x/RATE,y/RATE); //设置位置 
    Body bodyTemp=world.createBody(bodyDef); //在世界中创建刚体 
    bodyTemp.createShape(shape); //指定刚体形状 
    bodyTemp.setMassFromShapes(); //设置物体质量 
    return new MyCircleColor(bodyTemp, radius, color); 
  } 
}

(6)颜色工具类ColorUtil


package box2d.bheap; 
public class ColorUtil { 
  static int[][] result=  
    { 
      {56,225,254},   
      {41,246,239}, 
      {34,244,197}, 
      {44,241,161}, 
      {65,239,106}, 
      {45,238,59}, 
      {73,244,51},   
      {99,233,58}, 
      {129,243,34}, 
      {142,245,44}, 
      {187,243,32}, 
      {232,250,28}, 
      {242,230,46}, 
      {248,196,51}, 
      {244,125,31}, 
      {247,88,46}, 
      {249,70,40}, 
      {249,70,40}, 
      {248,48,48}, 
      {250,30,30}, 
      {252,15,15}, 
      {255,0,0},  
    }; 
    public static int getColor(int index) 
    { 
      int[] rgb=result[index%result.length]; 
      int result=0xff000000; 
      result=result|(rgb[0]<<16); 
      result=result|(rgb[1]<<8); 
      result=result|(rgb[2]); 
      return result; 
    } 
}

(7)主控制类MyBox2dActivity


package box2d.bheap;    
import java.util.ArrayList; 
import java.util.Random; 
import org.jbox2d.collision.AABB;   
import org.jbox2d.common.Vec2;   
import org.jbox2d.dynamics.World;    
import android.app.Activity;   
import android.content.pm.ActivityInfo; 
import android.os.Bundle;   
import android.util.DisplayMetrics; 
import android.view.Window;   
import android.view.WindowManager;  
import static box2d.bheap.Constant.*; 
public class MyBox2dActivity extends Activity  
{   
  AABB worldAABB;//创建 一个管理碰撞的世界   
  World world; 
  Random random=new Random(); 
  //物体列表 
  ArrayList<MyBody> bl=new ArrayList<MyBody>(); 
  public void onCreate(Bundle savedInstanceState)  
  {   
    super.onCreate(savedInstanceState); 
    //设置为全屏 
    requestWindowFeature(Window.FEATURE_NO_TITLE);   
    getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,   
    WindowManager.LayoutParams. FLAG_FULLSCREEN);  
    //设置为横屏模式 
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
    //获取屏幕尺寸 
    DisplayMetrics dm=new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(dm);  
    if(dm.widthPixels<dm.heightPixels) 
    { 
       SCREEN_WIDTH=dm.widthPixels; 
       SCREEN_HEIGHT=dm.heightPixels; 
    } 
    else 
    { 
      SCREEN_WIDTH=dm.heightPixels; 
      SCREEN_HEIGHT=dm.widthPixels;   
    } 
    worldAABB = new AABB();   
    //上下界,以屏幕的左上方为 原点,如果创建的刚体到达屏幕的边缘的话,会停止模拟   
    worldAABB.lowerBound.set(-100.0f,-100.0f); 
    worldAABB.upperBound.set(100.0f, 100.0f);//注意这里使用的是现实世界的单位   
    Vec2 gravity = new Vec2(0.0f,10.0f); 
    boolean doSleep = true; 
    //创建世界  
    world = new World(worldAABB, gravity, doSleep);      
    //创建4边 
    final int kd=40;//宽度或高度 
    MyRectColor mrc=Box2DUtil.createBox(kd/4, SCREEN_HEIGHT/2, kd/4, SCREEN_HEIGHT/2, true,world,0xFFe6e4FF); 
    bl.add(mrc); 
    mrc=Box2DUtil.createBox(SCREEN_WIDTH-kd/4, SCREEN_HEIGHT/2, kd/4, SCREEN_HEIGHT/2, true,world,0xFFe6e4FF); 
    bl.add(mrc); 
    mrc=Box2DUtil.createBox(SCREEN_WIDTH/2, kd/4, SCREEN_WIDTH/2, kd/4, true,world,0xFFe6e4FF); 
    bl.add(mrc); 
    mrc=Box2DUtil.createBox(SCREEN_WIDTH/2, SCREEN_HEIGHT-kd/4, SCREEN_WIDTH/2, kd/4, true,world,0xFFe6e4FF); 
    bl.add(mrc); 
    //创建砖块 
    //砖块间距 行间距为20   模块宽度为10 最多一行为9块 
    final int bs=20; 
    final int bw=(int)((SCREEN_WIDTH-2*kd-11*bs)/18); 
    //============================================================
    for(int i=2;i<10;i++) 
    { 
      if((i%2)==0) 
      { 
        //左侧蓝木块 
        for(int j=0;j<9-i;j++) 
        { 
          mrc=Box2DUtil.createBox 
          ( 
            kd/2+bs+bw/2+i*(kd+5)/2+j*(kd+5)+3, 
            SCREEN_HEIGHT+bw-i*(bw+kd)/2, 
            bw/2, 
            kd/2, 
            false, 
            world, 
            ColorUtil.getColor(Math.abs(random.nextInt())) 
          ); 
          bl.add(mrc); 
        } 
        //右侧蓝木块 
        for(int j=0;j<9-i;j++) 
        { 
          mrc=Box2DUtil.createBox 
          ( 
            3*kd/2+bs-bw/2+i*(kd+5)/2+j*(kd+5)-3, 
            SCREEN_HEIGHT+bw-i*(bw+kd)/2, 
            bw/2, 
            kd/2, 
            false, 
            world, 
            ColorUtil.getColor(Math.abs(random.nextInt())) 
          ); 
          bl.add(mrc); 
        } 
      }   
      if((i%2)!=0) 
      { 
        for(int j=0;j<10-i;j++) 
        { 
          mrc=Box2DUtil.createBox 
          ( 
            kd/2+bs+kd/2+(i-1)*(kd+5)/2+j*(kd+5), 
            SCREEN_HEIGHT-(kd-bw)/2-(i-1)*(bw+kd)/2, 
            kd/2, 
            bw/2, 
            false, 
            world, 
            ColorUtil.getColor(Math.abs(random.nextInt())) 
          ); 
          bl.add(mrc); 
        } 
      } 
    } 
    mrc=Box2DUtil.createBox 
    ( 
      5*kd+bs+20, 
      SCREEN_HEIGHT-(kd+bw)*4-kd, 
      bw/2, 
      kd/2, 
      false, 
      world, 
      ColorUtil.getColor(Math.abs(random.nextInt())) 
    ); 
    bl.add(mrc); 
    //创建球 
    MyCircleColor ball=Box2DUtil.createCircle(SCREEN_WIDTH/2-24, kd, kd/2, world,ColorUtil.getColor(Math.abs(random.nextInt()))); 
    bl.add(ball); 
    ball.body.setLinearVelocity(new Vec2(0,50)); 
    GameView gv= new GameView(this);
    setContentView(gv);
  }
}

(8)显示界面类GameView


package box2d.bheap;
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.view.SurfaceHolder; 
import android.view.SurfaceHolder.Callback; 
import android.view.SurfaceView; 
public class GameView extends SurfaceView implements Callback{ 
  MyBox2dActivity activity; 
  Paint paint; 
  DrawThread dt; 
  public GameView(MyBox2dActivity activity) { 
    super(activity); 
    this.activity=activity; 
    this.getHolder().addCallback(this);  
    paint =new Paint(); 
    paint.setAntiAlias(true); 
    dt=new DrawThread(this); 
    dt.start(); 
  } 
  public void onDraw(Canvas canvas) { 
    if(canvas==null) { 
      return ; 
    } 
    canvas.drawARGB(255, 255, 255, 255); //设置背景颜色白色 
    for (MyBody mb : activity.bl) { 
      mb.drawSelf(canvas, paint); 
    } 
  } 
  @Override 
  public void surfaceChanged(SurfaceHolder holder, int format, int width, 
      int height) { 
  } 
  @Override 
  public void surfaceCreated(SurfaceHolder holder) { 
        repaint(); 
  } 
  @Override 
  public void surfaceDestroyed(SurfaceHolder holder) { 
  } 
  public void repaint() { 
    SurfaceHolder holder=this.getHolder(); 
    Canvas canvas=holder.lockCanvas(); 
    try { 
      synchronized(holder){ 
        onDraw(canvas); 
      } 
    } catch(Exception e){ 
      e.printStackTrace(); 
    } finally { 
      if(canvas!=null) { 
        holder.unlockCanvasAndPost(canvas);  
      } 
    } 
  } 
}

(9)绘制线程类DrawThread


package box2d.bheap; 
import static box2d.bheap.Constant.*; 
//绘制线程 
public class DrawThread extends Thread 
{ 
  GameView gv; 
  public DrawThread(GameView gv) 
  { 
    this.gv=gv; 
  } 
  @Override 
  public void run() 
  { 
    while(DRAW_THREAD_FLAG) 
    { 
      gv.activity.world.step(TIME_STEP, ITERA);//开始模拟 
      gv.repaint(); 
      try  
      { 
        Thread.sleep(20); 
      } catch (InterruptedException e)  
      { 
        e.printStackTrace(); 
      } 
    } 
  } 
}

希望本文所述对大家的jsp程序设计有所帮助。

您可能感兴趣的文章:Android游戏源码分享之2048Android 游戏开发之Canvas画布的介绍及方法Android游戏开发实践之人物移动地图的平滑滚动处理解析Android游戏中获取电话状态进行游戏暂停或继续的解决方法Unity3D游戏引擎实现在Android中打开WebView的实例Android 游戏引擎libgdx 资源加载进度百分比显示案例分析android游戏载入的activity跳转到游戏主菜单的activity具体实现Android游戏开发学习①弹跳小球实现方法以一个着色游戏展开讲解Android中区域图像填色的方法最常见的猜拳小游戏Android代码实现


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android游戏开发学习之引擎用法实例详解

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android游戏开发学习之引擎用法实例详解

本文实例讲述了Android游戏开发学习之引擎用法。分享给大家供大家参考。具体如下: 汽车引擎是汽车的心脏,其决定了汽车的性能和稳定性,是人们在购车时相当关注的。而游戏中的物理引擎就如汽车的引擎一样,占据了非常重要的位置。一款好的物理引擎可
2022-06-06

Android游戏开发学习①弹跳小球实现方法

本文实例讲述了Android游戏开发学习①弹跳小球实现方法。分享给大家供大家参考。具体如下: 在学习了一点点Android之后,觉得有必要记录下来,于是就开了这个新坑,慢慢来填吧。 1.运动体Movable类 本例主要模拟了一组大小不一的球
2022-06-06

Android开发之TabActivity用法实例详解

本文实例讲述了Android开发之TabActivity用法。分享给大家供大家参考,具体如下: 一.简介 TabActivity继承自Activity,目的是让同一界面容纳更多的内容。TabActivity实现标签页的功能,通过导航栏对各个
2022-06-06

游戏物理引擎技术详解:打造真实游戏世界(游戏开发中物理引擎如何营造真实环境?)

物理引擎是现代游戏开发的核心组件,用于模拟现实物理定律,赋予游戏中的物体、角色和环境可信的运动和交互特性。它包括刚体物理(模拟重力、碰撞和力)、流体模拟(处理液体运动)、软体模拟(模拟布料、橡胶等变形行为)、破坏模拟(物体断裂)、角色动画(模拟肌肉、骨骼运动),以及人工智能(增强角色行为)。物理引擎在优化和应用方面也至关重要,在未来随着云物理、机器学习和触觉反馈的发展,将带来更真实的和令人信服的游戏体验。
游戏物理引擎技术详解:打造真实游戏世界(游戏开发中物理引擎如何营造真实环境?)
2024-04-02

Android游戏开发学习②焰火绽放效果实现方法

本文实例讲述了Android游戏开发学习②焰火绽放效果实现方法。分享给大家供大家参考。具体如下: 本节介绍在游戏开发中常用到的数学物理应用——粒子系统。粒子系统与上一节的小球有类似的地方,都是通过数学方法和物理公式模拟客观世界中的物体的运动
2022-06-06

Android开发之TimePicker控件用法实例详解

本文实例分析了Android开发之TimePicker控件用法。分享给大家供大家参考,具体如下: 新建项目: New Android Project-> Project name:HelloSpinner Build Target:Andr
2022-06-06

Android开发之Animations动画用法实例详解

本文实例讲述了Android开发之Animations动画用法。分享给大家供大家参考,具体如下: 一、动画类型 Android的animation由四种类型组成:alpha、scale、translate、rotate XML配置文件中al
2022-06-06

Android开发学习之WallPaper设置壁纸详细介绍与实例

今天和大家分享的是关于在Android中设置壁纸的方法,在Android中设置壁纸的方法有三种,分别是: 1、使用WallpaperManager的setResource(int ResourceID)方法 2、使用WallpaperMan
2022-06-06

mysql学习笔记之完整的select语句用法实例详解

本文实例讲述了mysql学习笔记之完整的select语句用法。分享给大家供大家参考,具体如下: 本文内容:完整语法去重选项字段别名数据源wheregroup byhavingorder bylimit首发日期:2018-04-11完整语法:
2022-05-20

Android开发之浏览器用法实例详解(调用uc,opera,qq浏览器访问网页)

本文实例讲述了Android开发之浏览器用法。分享给大家供大家参考,具体如下: 一、启动android默认浏览器Intent intent = new Intent(); intent.setAction("android.intent.a
2022-06-06

JAVA 开发之用静态方法返回类名的实例详解

JAVA 开发之用静态方法返回类名的实例详解前言:最初碰到这个问题,首先想到的是getClass()方法,如下尝试:public static String getClassName(){ String className=null; cl
2023-05-31

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录