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

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

1、布局界面

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 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" >
 <www.csdn.net.tetris.view.GameView
  android:id="@+id/gameview"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"/>
 <Button
  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" />
 <Button
  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" />
</RelativeLayout>

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程序设计有所帮助。

(0)

相关推荐

  • PC版与Android手机版带断点续传的多线程下载

    一.多线程下载 多线程下载就是抢占服务器资源 原理:服务器CPU 分配给每条线程的时间片相同,服务器带宽平均分配给每条线程,所以客户端开启的线程越多,就能抢占到更多的服务器资源. 1.设置开启线程数,发送http请求到下载地址,获取下载文件的总长度           然后创建一个长度一致的临时文件,避免下载到一半存储空间不够了,并计算每个线程下载多少数据              2.计算每个线程下载数据的开始和结束位置           再次发送请求,用 Range 头请求开始位置和结束位

  • Android 多线程处理之多线程详解

    handler.post(r)其实这样并不会新起线程,只是执行的runnable里的run()方法,却没有执行start()方法,所以runnable走的还是UI线程. 1.如果像这样,是可以操作ui,但是run还是走在主线程,见打印出来的Log线程名字是main,说明是主线程. 这就是为什么可以直接在run方法里操作ui,因为它本质还是ui线程 handler.post(new Runnable(){ public void run(){ Log.e("当前线程:",Thread.c

  • Android App中使用SurfaceView制作多线程动画的实例讲解

    1. SurfaceView的定义 通常情况程序的View和用户响应都是在同一个线程中处理的,这也是为什么处理长时间事件(例如访问网络)需要放到另外的线程中去(防止阻塞当前UI线程的操作和绘制).但是在其他线程中却不能修改UI元素,例如用后台线程更新自定义View(调用View的在自定义View中的onDraw函数)是不允许的. 如果需要在另外的线程绘制界面.需要迅速的更新界面或则渲染UI界面需要较长的时间,这种情况就要使用SurfaceView了.SurfaceView中包含一个Surface

  • Android编程开发实现多线程断点续传下载器实例

    本文实例讲述了Android编程开发实现多线程断点续传下载器.分享给大家供大家参考,具体如下: 使用多线程断点续传下载器在下载的时候多个线程并发可以占用服务器端更多资源,从而加快下载速度,在下载过程中记录每个线程已拷贝数据的数量,如果下载中断,比如无信号断线.电量不足等情况下,这就需要使用到断点续传功能,下次启动时从记录位置继续下载,可避免重复部分的下载.这里采用数据库来记录下载的进度. 效果图:   断点续传 1.断点续传需要在下载过程中记录每条线程的下载进度 2.每次下载开始之前先读取数据库

  • Android实现多线程下载文件的方法

    本文实例讲述了Android实现多线程下载文件的方法.分享给大家供大家参考.具体如下: 多线程下载大概思路就是通过Range 属性实现文件分段,然后用RandomAccessFile 来读写文件,最终合并为一个文件 首先看下效果图: 创建工程 ThreadDemo 首先布局文件 threaddemo.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo

  • Android Handler多线程详解

    Android--多线程之Handler 前言 Android的消息传递机制是另外一种形式的"事件处理",这种机制主要是为了解决Android应用中多线程的问题,在Android中不 允许Activity新启动的线程访问该Activity里的UI组件,这样会导致新启动的线程无法改变UI组件的属性值.但实际开发中,很多地方需要在 工作线程中改变UI组件的属性值,比如下载网络图片.动画等等.本篇博客主要介绍Handler是如何发送与处理线程上传递来的消息,并讲解 Message的几种传递数

  • Android版多线程下载 仿下载助手(最新)

    首先声明一点: 这里的多线程下载并不是指多个线程下载一个 文件,而是每个线程负责一个文件,今天给大家分享一个多线程下载的 例子.先看一下效果,点击下载开始下载,同时显示下载进度,下载完成,变成程安装,点击安装提示安装应用. 界面效果图: 线程池ThreadPoolExecutor ,先简单学习下这个线程池的使用 /** * Parameters: corePoolSize the number of threads to keep in the pool, even if they are id

  • 实例讲解Android多线程应用开发中Handler的使用

    其实可以理解Handler为主线程和另外的线程之间进行数据更新的东东,并且Handler在主线程中,并在Handler直接调用线程的run方法 package com.Handler02; import android.app.Activity; import android.os.Bundle; import android.os.Handler; public class Handler02Activity extends Activity { /** Called when the act

  • Android多线程处理机制中的Handler使用介绍

    接下来让我介绍Android的Handler的使用方法.Handler可以发送Messsage和Runnable对象到与其相关联的线程的消息队列.每个Handler对象与创建它的线程相关联,并且每个Handler对象只能与一个线程相关联. Handler一般有两种用途:1)执行计划任务,你可以再预定的实现执行某些任务,可以模拟定时器.2)线程间通信.在Android的应用启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息.当你创建子线程时,你可以再你的子线程中拿到父线程中创建的Ha

  • Android编程开发实现带进度条和百分比的多线程下载

    本文实例讲述了Android编程开发实现带进度条和百分比的多线程下载.分享给大家供大家参考,具体如下: 继上一篇<java多线程下载实例详解>之后,可以将它移植到我们的安卓中来,下面是具体实现源码: DownActivity.java: package com.example.downloads; import java.io.File; import java.io.IOException; import java.io.RandomAccessFile; import java.net.H

  • Android 中 EventBus 的使用之多线程事件处理

    在这一系列教程的最后一篇中,我想谈谈GR的EventBus,在处理多线程异步任务时是多么简单而有效. AsyncTask, Loader和Executor-- 拜托! Android中有很多种执行异步操作的方法(指平行于UI线程的).AsyncTask对于用户来说是最简单的一种机制,并且只需要少量的设置代码即可.然而,它的使用是有局限的,正如Android官方文档中所描述的: AsyncTask被设计成为一个工具类,在它内部包含了Thread和Handler,但它本身并不是通用线程框架的一部分.

随机推荐