热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能实例

这篇文章主要介绍了Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能的方法,涉及Android多线程编程及图形绘制相关技巧,需要的朋友可以参考下

本文实例讲述了Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能的方法。分享给大家供大家参考,具体如下:

1、布局界面


 
 

2、封装的一个绘制的图的类

package www.csdn.net.tetris.domain;
import www.csdn.net.tetris.view.GameView;
public class Block {
 private int x=20,y=20;
 public GameView gameView;
 public Block(GameView gameView){
  this.gameView=gameView;
 }
 //向左移动
 public void moveLeft(){
  x-=10;
  gameView.invalidate();
 }
 //向右移动
 public void moveRight(){
  x+=10;
  gameView.invalidate();
 }
 //下落方法
  public void downLoad(){
   y+=10;
   gameView.invalidate();//重新绘制
  }
 public int getX() {
  return x;
 }
 public void setX(int x) {
  this.x = x;
 }
 public int getY() {
  return y;
 }
 public void setY(int y) {
  this.y = y;
 }
}

3、创建一个画布和线程的操作

package www.csdn.net.tetris.view;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.View;
import www.csdn.net.tetris.domain.Block;
public class GameView extends View {
 public static Block block;
 public Handler handler;
 //定义方向
 public static int dir=-1;
 //上下左右
 public static final int DIRUP=1;
 public static final int DIRDOWN=2;
 public static final int DIRLEFT=3;
 public static final int DIRRIGHT=4;
 public GameView(Context context,AttributeSet attrs) {
  super(context);
  //创建俄罗斯方块对象
  this.block=new Block(this);
  handler=new Handler(){
   public void handleMessage(Message msg) {
    super.handleMessage(msg);
    switch (msg.what) {
    case DIRLEFT:
     GameView.block.moveLeft();
     break;
    case DIRRIGHT:
     GameView.block.moveRight();
     break;
    default:
     GameView.block.downLoad();
     break;
    }
   }
  };
  //创建线程
  new Thread (new Runnable(){
   @Override
   public void run() {
    while(true){
     try{
      System.out.println("子线程名称:::"+Thread.currentThread().getName());
      //block.downLoad();
      Thread.sleep(1000);
      handler.sendEmptyMessage(dir);
     }catch(Exception e){
      e.printStackTrace();
     }
    }
   }
  }).start();
 }
 @Override
 protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  //设置了画布的颜色
  canvas.drawARGB(255, 0, 0, 255);
  //设置一个画笔
  Paint paint=new Paint();
  paint.setARGB(255, 255, 0, 0);
  canvas.drawCircle(block.getX(), block.getY(), 10, paint);
 }
}

4、在MainActivity中的操作

package com.example.tetris;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import www.csdn.net.tetris.domain.Block;
import www.csdn.net.tetris.view.GameView;
public class GameActivity extends Activity {
//声明按钮控件
public Button btn_start;
public Button btn_right;
public Button btn_left;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_game);
//获取按钮控件
btn_start=(Button) findViewById(R.id.btn_start);
btn_start.setOnClickListener(new MyOnClickListener());
System.out.println("主线程:::"+Thread.currentThread().getName());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
class MyOnClickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
int id=v.getId();
switch (id) {
case R.id.btn_start:
//GameView gameView=new GameView(GameActivity.this,null);
GameActivity.this.setContentView(R.layout.activity_layout);
//获取控件
btn_right=(Button) findViewById(R.id.btn_right);
btn_left=(Button) findViewById(R.id.btn_left);
btn_left.setOnClickListener(new MyOnClickListener());
btn_right.setOnClickListener(new MyOnClickListener());
break;
case R.id.btn_left:
Toast.makeText(GameActivity.this, "向左移动", Toast.LENGTH_LONG).show();
GameView.block.moveLeft();
//GameView.dir=GameView.DIRLEFT;
break;
case R.id.btn_right:
Toast.makeText(GameActivity.this, "向右移动", Toast.LENGTH_LONG).show();
GameView.block.moveRight();
//GameView.dir=GameView.DIRRIGHT;
break;
default:
break;
}
}
}
}

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


推荐阅读
  • 本文介绍了两种有效的方法来检查Android应用是否拥有特定权限,如媒体读写权限(media_rw)。通过这些方法,开发者和安全人员可以更好地了解应用的行为,确保其不会滥用权限。 ... [详细]
  • 本文详细介绍了ejabberd中的验证码服务、接收器以及服务器间通信的监督者和工作进程,包括它们的启动方式和主要功能。 ... [详细]
  • 深入理解Java NIO:基础概念与原理
    本文介绍了Java NIO(New Input/Output)的基本概念,包括同步与异步、阻塞与非阻塞等核心理念,以及NIO相对于传统IO的优势和应用场景。通过详细解析这些概念,帮助读者更好地理解和掌握NIO的使用。 ... [详细]
  • Struts2(六) 用Struts完成客户列表显示
    Struts完成客户列表显示所用的基础知识在之前的随笔中已经讲过。这篇是介绍如何使用Struts完成客户列表显示。下面是完成的代码执行逻辑图:抽取项目部分代码相信大家 ... [详细]
  • 在尝试将SpringBoot与MyBatis框架进行集成时,遇到了一个常见的问题:org.apache.ibatis.builder.BuilderException。此错误通常指示XML配置文件中存在语法或结构上的问题。本文将探讨具体原因及解决方案。 ... [详细]
  • 本文深入探讨了在Java编程语言中,如何使用`org.apache.polygene.api.association.AssociationDescriptor.qualifiedName()`方法,并提供了多个实际应用的代码示例。这些示例源自GitHub、StackOverflow和Maven等知名平台,旨在帮助开发者更好地理解和应用这一方法。 ... [详细]
  • 本实验利用xmlspy2013和firefox工具,探讨如何编写和验证基于DTD的XML文档。实验包括分析XML实例以创建相应的DTD文档,并通过编写有效的XML文档来验证DTD的有效性。 ... [详细]
  • 本文详细介绍了MyBatis中的延迟加载功能,包括其基本概念、实现方式以及如何在实际开发中应用。通过具体的代码示例,帮助读者更好地理解和掌握这一优化数据库查询性能的重要技术。 ... [详细]
  • 在日常开发中,经常需要通过Web服务进行数据交互。然而,在参数传递时会遇到一些限制,例如自定义实体类和Hashtable等复杂数据类型无法直接传递。本文将详细介绍如何在ASP.NET环境中有效地传递Hashtable数据。 ... [详细]
  • 本文详细介绍了DOM(文档对象模型)的基本概念、结构及操作方法。DOM作为一种API,允许开发者以编程方式访问HTML和XML文档的结构,实现页面内容的动态修改。 ... [详细]
  • 本文详细探讨了在 Spring Boot 应用中遇到 'Invalid bound statement (not found)' 错误时的解决方法,重点检查 MyBatis 的配置文件中 mapper-locations 路径设置是否正确。 ... [详细]
  • 构建Struts 2 Web应用程序指南
    本文提供了一个详细的步骤指南,帮助开发者从零开始创建一个简单的Struts 2 Web应用程序,涵盖了从环境搭建到项目部署的全过程。 ... [详细]
  • 优化 DropDownList 与 TextBox 的交互体验
    本文介绍了一种解决方案,通过在 DropDownList 前添加一个 TextBox 来提升用户体验。当选项过多时,用户可以通过在 TextBox 中输入关键词来快速定位并选择相应的选项。 ... [详细]
  • 本教程将指导您完成 Spring Boot 应用程序中 MySQL 数据库的配置,并通过 JdbcTemplate 进行基本的数据操作测试。在此之前,我们已经成功打包并测试了 jar 和 war 包,同时实现了 JSP 页面的访问,但页面数据是静态配置的。现在,让我们一起进入数据库配置的世界。 ... [详细]
  • 现代软件工程开发体验:结对编程
    距现代软件工程开课已经3周,按照课程安排,在最近的9天中,我们进行了极限编程模式的体验:pairwork(结对编程,具体见链接),对象是在academicsearchmap上添加一些新特性。经过选 ... [详细]
author-avatar
mobiledu2502873927
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有