android知识浓缩版之消息机制、线程周期启动、图形与NDK开发举例

作者:金良([email protected]) csdn博客:http://blog.csdn.net/u012176591

android知识浓缩版之消息机制、线程周期启动、图形与NDK开发举例_第1张图片

1.MainActivity.java

package com.example.monitor;

import java.util.Timer;
import java.util.TimerTask;


import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.ImageView;


public class MainActivity extends Activity {
	// 定义一个接收C代码中的压力值的变量
	private int pressure;
	// 声明的本地方法,在C代码中实现获取当前压力值的逻辑
	public native int getPressure();
	// 将动态库文件加载进来
	static {
		System.loadLibrary("Hello");
	}
	// 接收子线程发送过来的消息(传递给主线程),让主线程更新数据
	Handler handler = new Handler() {
		// 定义一个颜色的变量
		int color;
		// 实现未实现的handleMessage方法
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			//压力值处于不同的范围,对应有不同的颜色
			// 压力值在0-99之间
			if (pressure < 100) {
				color = Color.GREEN;
				// 压力值在100-199之间
			} else if (pressure < 200) {
				color = Color.YELLOW;
				// 压力值在199-279之间
			} else if (pressure < 280) {
				color = Color.RED;
				// 压力值在280-300之间
			} else {
				//创建出一个图片对象
				ImageView iv = new ImageView(MainActivity.this);
				//设置爆炸时的图片
				iv.setImageResource(R.drawable.boom);
				//锅炉爆炸后,应当取消定时器,不在获取锅炉的压力值了。
				timer.cancel();
				//将当前屏幕的UI界面设置为爆炸时的界面
				setContentView(iv);
				//当前的界面设置为爆炸时的界面后,应该让界面停止在爆炸时的界面上,不能够再执行其它的操作。
				return;
			}
			//自定义View,用于显示锅炉的压力值和颜色。当获取到锅炉的压力值及对应的颜色后,应当让界面根据压力值显示长方形的高度和颜色
			MyView myview = new MyView(MainActivity.this, color);
			//将自定义的UI显示到界面上。
			setContentView(myview);
		}

	};
	//定时器任务,用于获取锅炉的压力值。
	TimerTask task = new TimerTask() {

		@Override
		public void run() {
			//调用native方法,获取到C语言返回的压力值
			pressure = getPressure();
			//将从C语言端获取到的压力值打印在LogCat中
			System.out.println("锅炉的压力为" + pressure);
			//向主线程发送一个空消息,用于让主线程更新UI界面。
			handler.sendEmptyMessage(0);
		}
	};
	//获取到一个定时器对象
	Timer timer = new Timer();

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		//执行定时任务,参数二:该定时器开始执行任务时延时时间(单位为毫秒),参数三:每隔多久重新执行一次任务。
		timer.schedule(task, 1000, 1000);
	}
	//当Activity处于停止状态时,我们取消定时器的执行
	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		//可以让定时器停止执行
		timer.cancel();
	}
	//自定义View对象,根据压力值来显示长方形的高度和颜色。
	private class MyView extends View {
		//接收Handler中传递过来的颜色值
		int color;
		//实例化当前的对象(MyView)时,需要将颜色值传递进来。压力值被定义成了一个成员变量
		public MyView(Context context, int color) {
			super(context);
			this.color = color;
		}

		//某一个控件View对象被显示到界面上时调用的方法
		@Override
		protected void onDraw(Canvas canvas) {
			super.onDraw(canvas);
			// canvas 画布
			// Paint 画笔
			Paint paint = new Paint();
			//使用画笔往长方形上涂画颜色
			paint.setColor(color);
			//使用画布来画出图形。参数一:起始X坐标,参数二:起始时的Y坐标,
			//参数三:结束时的X坐标,参数四:结束时的Y坐标,参数五:传入画笔的参数(这里的画笔描绘出了图形的颜色)
			canvas.drawRect(30, 10, 50, pressure, paint);
		}
	}
}


2.Hello.c

#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
#ifdef __cplusplus
extern "C" {
#endif
int getPressure(){
	//rand()方法所表示的数值的范围在0~2147483648之间
    return rand();
}
JNIEXPORT jint JNICALL Java_com_guoshisp_monitor_MainActivity_getPressure
  (JNIEnv * env, jobject thiz){
	//我们通过“%300”的操作,可以控制该值的范围为0~300
	return getPressure()%300;
}
#ifdef __cplusplus
}
#endif

3.Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS) #类似于工具初始化的操作 
LOCAL_MODULE    := Hello
LOCAL_SRC_FILES := Hello.c
include $(BUILD_SHARED_LIBRARY) 






你可能感兴趣的:(android,schedule,handler,NDK,画图)