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

1、布局界面

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context=".GameActivity" >

android:id="@+id/gameview"

android:layout_width="wrap_content"

android:layout_height="wrap_content"/>

android:id="@+id/btn_left"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignLeft="@+id/gameview"

android:layout_alignParentBottom="true"

android:text="@string/btn_text" />

android:id="@+id/btn_right"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignBottom="@+id/gameview"

android:layout_centerHorizontal="true"

android:layout_alignParentBottom="true"

android:text="@string/btn_right" />

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设计一个多线程和画图的程序小球,Android开发之多线程中实现利用自定义控件绘制小球并完成小球自动下落功能实例...相关推荐

  1. 设计一个基于GUI的扑克程序

    2019独角兽企业重金招聘Python工程师标准>>> 在本课程教材扑克牌代码的基础上,设计一个基于GUI的扑克程序 a) 可以显示 52 张扑克牌,包括洗牌,发牌在内(2) b) ...

  2. 生物信息学:任选一种编程语言,设计一个双序列全局比对的程序

    任选一种编程语言,设计一个双序列全局比对的程序.要求: 1) 输入两条蛋白质序列,输出比对结果例如: Alignment Score: 12345 E E E E E K K K K K A A A ...

  3. C++数据结构||为我院设计一个简单的教师信息管理程序。对我院教师进行管理,包括插入、删除、查找、排序等功能。教师信息包括姓名、性别、出生年月、工作年月、学历、职务、住址、电话等信息。

    0.先序条件 在文件夹中新建名称"教师信息.txt"的文本文件存储教师信息 visual studio 2017 1.背景 数据结构课程设计的作业 为我院设计一个简单的教师信息管理 ...

  4. Java黑皮书课后题第9章:**9.13(Location类)设计一个名为Location的类,定位二维数组中的最大值及其位置。

    Java黑皮书课后题第9章:**9.13(Location类)设计一个名为Location的类,定位二维数组中的最大值及其位置 题目 破题 代码 Test13 Test13_Location 运行结果 ...

  5. 一串首尾相连的珠子(m个),有N种颜色(N《=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。

    一串首尾相连的珠子(m个),有N种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短.并分析时间复杂度与空间复杂度. 这道题在网上著名的帖子 微软等公司数据结构+ ...

  6. Android设计一个图片加载框架

    本文不是具体编码去实现一个图片加载的框架,而是从理论上来讲解设计一个图片加载框架的注意事项和涉及的知识点,提供一个思路,或者帮助童鞋们应付面试.目前Android 发展至今优秀的图片加载框架太多,例如 ...

  7. 为知更新Android下一个apk安装多个程序入口图标

    Android开发中,一个工程对应一个AndroidManifest.xml文件,这个文件中包含有该项目的一些设置,如权限.SDk版本,Activity.Service信息等.一般而言,这个文件中会有 ...

  8. Pyqt5入门--用qtdesigner设计一个计算屏幕PPI小程序(qtdesigner/pyuic/pyinstaller/python)

    本文利用python中的pyqt5包,设计一个计算PPI小程序的界面,再利用pyuic将界面的ui文件转为py文件.再新建一个py文件继承界面py文件中类,并定义每一个按钮对应的函数,完成后利用pyi ...

  9. 创建一个属于自己的小程序(注册开发账号)

    微信小程序入门指南 一. 如何创建一个属于自己的小程序 首先,需要注册一个小程序开发账号. 使用浏览器打开 https://mp.weixin.qq.com/ 网址,点击右上角的"立即注册& ...

最新文章

  1. PythonGUI开发:59行代码开发小型商店添加系统
  2. django 快速搭建blog
  3. java单例模式几种实现方式
  4. SQL 中 PROCEDURE,TRIGGER,FUNCTION简单应用
  5. Spring Boot基础
  6. 51单片机C语言堆栈,《单片机C语言试题》(一)20101027
  7. 拓端tecdat|R语言乘法GARCH模型对高频交易数据进行波动性预测
  8. 一次电子罗盘+GPS智能转舵小车
  9. T分布和T检验的理解,Python代码实现T检验的计算
  10. ubuntu 分区大小调整_如何调整Ubuntu分区的大小
  11. Docker 配置国内镜像加速器,加速下载速度
  12. Python的exec
  13. FFmpeg之FLV Muxing Demuxing
  14. ubuntu服务器dns修改,如何在 Ubuntu 16 中修改 DNS 服务器?
  15. 电影《功夫熊猫2》中的管理知识
  16. 【LeetCode】1402. 做菜顺序 Reducing Dishes
  17. python识别中文人名_中文人名识别
  18. 搭建个人博客工具推荐
  19. 程序员如何解决中年危机?web前端开发工程师简历模板
  20. mac与linux屏幕共享软件,在 Mac 上使用「信息」远程共享你的电脑屏幕

热门文章

  1. 串行测试 并行测试_如何通过CircleCI测试并行性增加构建时间
  2. ubuntu手动修改anaconda环境变量
  3. 缺少Python27_d.lib的解决方法
  4. Java面试:Java面试总结PDF版
  5. 介绍一种 Python 更方便的爬虫代理池实现方案
  6. Python 写一个俄罗斯方块游戏
  7. HTTP面试题 ——TCP
  8. Spring boot admin 升级到2.3.1 遇到的问题总结
  9. 将excel转为python的字典_python读取excel数据转换成字典
  10. leetcode —— 41. 缺失的第一个正数