`
Aina_hk55HK
  • 浏览: 386326 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

Android 使用View类绘图

阅读更多
View类是Android的一个超类,这个类几乎包含了所有的屏幕类型,每一个View都有一个用户绘画的画布。任何一个View类都只要重写onDraw方法来实现界面显示。

package com.Aina.Android;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class ImageView extends View {

	public static int x = 20;
	public static int y = 20;
	
	public ImageView(Context context) {
		super(context);
	}

	/**
	 * 绘制方法.
	 */
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		Paint paint = new Paint();
		paint.setColor(Color.RED);//设置颜色
		canvas.drawRect(x, y, x+40, y+40, paint);//绘制一个矩形
	}

}



package com.Aina.Android;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.Window;
import android.view.WindowManager;
import android.util.DisplayMetrics;
import android.util.Log;

public class Test_View extends Activity {
	/** Called when the activity is first created. */
	private ImageView iv = null;
	private static final int MSG = 0x0000001;
	private int DisplayWidth = 0, DisplayHeight = 0;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		//隐藏标题栏和状态栏也可以设置主题(Theme)在AndridManifest.xml里面设置:android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"
		Window window = this.getWindow();
		window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
				WindowManager.LayoutParams.FLAG_FULLSCREEN);//隐藏状态栏
		this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏
		
		iv = new ImageView(this);
		setContentView(iv);
		// 获得屏幕宽带和高度
		DisplayMetrics dm = new DisplayMetrics();
		this.getWindowManager().getDefaultDisplay().getMetrics(dm);
		DisplayWidth = dm.widthPixels;// 屏幕宽带
		DisplayHeight = dm.heightPixels;// 屏幕高度

		MyThread th = new MyThread();
		th.start();
	}

	private Handler handle = new Handler() {
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if (msg.what == MSG) {
				iv.invalidate();// 更新界面
			}
		}
	};

	class MyThread extends Thread {
		public void run() {
			while (!Thread.currentThread().isInterrupted()) {// 当前线程没有中断
				try {
					Message msg = new Message();
					msg.what = MSG;
					Test_View.this.handle.sendMessage(msg);// 发送消息
					Thread.sleep(100);
				} catch (Exception ex) {
					ex.printStackTrace();
					Thread.currentThread().interrupt();// 中断当前线程.
				}

			}
		}
	}

	/*使用postInvalidate()方法更新界面,可以直接在线程里面更新。
	 * class MyThread extends Thread { public void run() { while
	 * (!Thread.currentThread().isInterrupted()) {// 当前线程没有中断 try {
	 * Thread.sleep(100); iv.postInvalidate(); } catch (Exception ex) {
	 * ex.printStackTrace(); Thread.currentThread().interrupt();// 中断当前线程. } } }
	 * }
	 */
	/**
	 * 触笔事件
	 */
	@Override
	public boolean onTouchEvent(MotionEvent event) {
				int x = (int) event.getX();
		int y = (int) event.getY();
		ImageView.x = x;
		ImageView.y=y;
		Log.d("EVENT", x+"|"+y);
		return super.onTouchEvent(event);
	}

	/**
	 * 键盘按下事件
	 */
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		switch (keyCode) {
		case KeyEvent.KEYCODE_DPAD_DOWN:// 向下
			Log.d("y", ImageView.y + "");
			if (ImageView.y + 40 >= DisplayHeight) {
				ImageView.y = DisplayHeight - 40;
			} else {
				ImageView.y += 5;
			}
			break;
		case KeyEvent.KEYCODE_DPAD_UP:// 向上
			if (ImageView.y <= 0) {
				ImageView.y = 0;
			} else {
				ImageView.y -= 5;
			}
			break;
		case KeyEvent.KEYCODE_DPAD_LEFT:// 向左
			if (ImageView.x <= 0) {
				ImageView.x = 0;
			} else {
				ImageView.x -= 5;
			}
			break;
		case KeyEvent.KEYCODE_DPAD_RIGHT:// 向右
			if (ImageView.x + 40 >= DisplayWidth) {
				ImageView.x = DisplayWidth - 40;
			} else {
				ImageView.x += 5;
			}
			break;
		default:
			break;
		}
		return super.onKeyDown(keyCode, event);
	}

	/**
	 * 键盘按下之后弹起事件
	 */
	@Override
	public boolean onKeyUp(int keyCode, KeyEvent event) {

		return super.onKeyUp(keyCode, event);
	}

}
分享到:
评论

相关推荐

    android自定义View-手绘地图

    android自定义View实现手绘地图,包括自定义view与自定义ViewGroup两种实现方式

    android view绘图机制.doc

    自己在各个博客copy总结下来的,适合刚刚接触View绘图机制或者Android源代码的初学者学习,浅显易懂

    Android -自定义view-Paint和Canvas.rar

    android 自定义view(Paint和Canvas),安卓自定义View,安卓自定义。

    Android View 绘制机制的详解

    整个 View 树的绘图流程在ViewRoot.java类的performTraversals()函数展开,该函数所做 的工作可简单概况为是否需要重新计算视图大小(measure)、是否需要重新安置视图的位置(layout)、以及是否需要重绘(draw),流程图...

    Android基于Canvas,自定义View实现的简单画图工具

    1、实现了画直线、矩形、圆形、手绘线。 2、实现了橡皮擦功能,对图上的线段可以擦除。 3、画完的图形可以保存为jpg格式的图片

    Android开发之自定义View(视图)用法详解

    View类是Android的一个超类,这个类几乎包含了所有的屏幕类型。每一个View都有一个用于绘图的画布,这个画布可以进行任意扩展。在游戏开发中往往需要自定义视图(View),这个画布的功能更能满足我们在游戏开发中的需要...

    Android UI开发专题

     android.view 显示类  android.widget 控件类  一、android.content.res.Resources  对于Android平台的资源类android.content.res.Resources可能很多网友比较陌生,一起来看看SDK上是怎么介绍的吧,Contains ...

    Android自定义View绘图实现拖影动画

    前几天在“Android绘图之渐隐动画”一文中通过画线实现了渐隐动画,但里面有个问题,画笔较粗(大于1)时线段之间会有裂隙,我又改进了一下。这次效果好多了。 先看效果吧: 然后我们来说说基本的做法:  •根据...

    Android 通过onDraw实现在View中绘图操作的示例

    以下是对Android通过onDraw实现在View中绘图操作的示例代码进行了详细的分析介绍,需要的朋友可以过来参考下

    使用traceview和dmtracedump调试Android代码

    使用traceview和dmtracedump调试Android代码   ✿Android程序调试工具  Google为我们提供的代码调试工具的亮点:traceview和dmtracedump。有了这两个工具,我们调试程序分析bug就非常得心应手了。traceview帮助...

    Android使用自定义View绘制渐隐渐现动画

    实现了一个有趣的小东西:使用自定义View绘图,一边画线,画出的线条渐渐变淡,直到消失。效果如下图所示: 用属性动画或者渐变填充(Shader)可以做到一笔一笔的变化,但要想一笔渐变(手指不抬起边画边渐隐),没...

    自定义view(Paint和Canvas)

    自定义view:简单了解Paint常用设置,Canvas的常用方法;

    Android自定义View绘图实现渐隐动画

    主要为大家详细介绍了Android自定义View绘图实现渐隐动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    《Android高级编程》

    4.2 View简介 4.2.1 使用View创建Activity(活动)用户界面 4.2.2 Android Widget工具箱 4.3 布局简介 4.4 创建新的View 4.4.1 修改现有的View 4.4.2 创建复合控件 4.4.3 创建定制的Widget和控件 4.4.4 使用定制的控件...

    Android高级编程--源代码

    作为使用androidsdk构建这些应用程序的实用指南书籍,《android高级编程》从始至终穿插了一系列示例项目,每个项目都引入android的新功能和新技术,以助您达到最圆满的学习效果。书中介绍android的所有基本功能,并...

    Android自定义View控件实现刷新效果

    三种得到LinearInflater的方法 a. LayoutInflater inflater = getLayoutInflater(); b....(LayoutInflater)context....onDraw 方法绘图,invalidate刷新界面。 效果图: 点击一下换颜色 onDraw画完图后,给控件设置点

    疯狂Android讲义源码

     1.3.2 使用Android模拟器  (Emulator) 14  1.3.3 使用DDMS进行调试 15  1.3.4 Android Debug Bridge(ADB)  的用法 16  1.3.5 使用DX编译Android应用 18  1.3.6 使用Android Asset Packaging  Tool...

    Android 自定义Paint画笔 canvas绘图例子.rar

    Android 自定义Paint画笔 canvas绘图例子,本例子中所用到的方法继承自android.view.View,是一个自定义View的范例,同时可学习画笔的定义:  Paint paint;//画笔  public MyView(Context context) {//构造器   ...

Global site tag (gtag.js) - Google Analytics