`
Aina_hk55HK
  • 浏览: 388580 次
  • 性别: 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比较综合的例子

    1. 创建一个新的Java类,继承自View或已有的View子类(如Button、ImageView等)。 2. 重写构造函数,通常会需要在构造函数中设置初始化参数。 3. 实现onDraw()方法,这是绘制View的核心,通过Canvas对象进行图形绘制...

    Android 自定义View视图

    1. **创建新类**:为了创建自定义View,我们需要创建一个新的Java类,这个类通常会继承自Android的`View`或`ViewGroup`类。在这个例子中,我们可能创建一个名为`CompassView`的类,继承自`View`。 2. **重写构造...

    android view的旋转

    在源码层面,这些旋转方法最终都会调用到`View#updateDisplayListIfDirty()`方法,该方法负责更新View的DisplayList,这是一个优化过的绘图指令列表。当View的状态改变时,DisplayList会被更新并用于渲染,从而提高...

    Android 自定义View实现水平温度计

    - 自定义View通常通过继承已有的View或 ViewGroup 类,如在本项目中,可能会继承自`View`类。 - 需要重写`onDraw()`方法,这是绘制View的主要入口,所有图形绘制都在这里进行。 2. **图形绘制**: - 使用`Canvas...

    android自定义View-手绘地图

    `onDraw()`方法是Android系统调用来绘制View的地方,我们在其中可以使用`Canvas`对象进行绘图。 1. 继承View 创建一个新的Java类,继承自`View`,并在构造函数中设置必要的初始化参数。例如,可能需要设置画布的...

    android 自定义View 实例

    在这个方法中,你可以使用Canvas对象进行绘图,如绘制线条、形状、文本等。例如: ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 在这里进行绘制操作 } ``` 4. 如果...

    Android中View绘制流程

    开发者可以在这个方法中使用Canvas对象进行绘图操作,如绘制文本、图片、形状等。`drawRect()`, `drawText()`, `drawBitmap()`等是常用的绘图API。 自定义ViewGroup时,需要重写这些方法以实现特定的布局逻辑。例如...

    android项目下对图片高斯模糊毛玻璃自定义view

    在Android中,自定义View是通过继承View或者ViewGroup类并重写其onDraw()方法来实现的。在这个项目中,你需要创建一个新的View类,包含绘制图片、应用高斯模糊和设置毛玻璃效果的方法。关键步骤包括: 1. 初始化:...

    Android自定义view——组合控件

    一个自定义View通常继承自Android的View或者ViewGroup类。如果我们的控件是单一的,如一个按钮或文本框,那么我们选择继承View;如果需要包含多个子视图并管理它们的布局,那么应该继承ViewGroup,如LinearLayout或...

    android 自定义View界面大合集

    1. **自定义View的基本原理**:自定义View通常基于`View`或`ViewGroup`类进行扩展,通过重写关键方法如`onDraw()`、`onMeasure()`和`onLayout()`来实现绘图逻辑和布局管理。理解这些方法的生命周期和工作原理是创建...

    Android自定义View—仿雷达扫描效果

    在`onDraw()`里,我们使用`Canvas`对象进行绘图操作,例如画圆、线段等,来模拟雷达扫描的效果。 雷达扫描通常包含以下几个关键元素: 1. 中心点:雷达扫描通常以屏幕中心为原点,所以我们需要确定这个中心点。 2. ...

    Android自定义View,View中的原点坐标相关问题

    在`onDraw()`中,我们可以使用Canvas对象提供的绘图API,如`drawRect()`, `drawCircle()`, `drawText()`等。这些方法接受矩形、圆心或文本的位置参数,这些位置参数就是基于当前View的坐标系统。 例如,要在一个...

    android 自定义view及自定义属性

    2. **重写onDraw()方法**:这是绘制View的核心,使用`Canvas`对象进行绘图操作,如画线、矩形、文本等。 3. **测量尺寸**:通过重写`onMeasure()`方法来确定自定义View的大小。遵循MeasureSpec规则,确保View能在...

    Android自定义view实现代码复用

    总结来说,Android自定义View的实现涉及多个方面,包括继承基类、重写绘图方法、定义和使用自定义属性、处理触摸事件等。通过这些技巧,开发者可以构建出强大且灵活的组件,为应用带来独特的视觉效果和交互体验。而...

    Android-Android自定义View有这些足够了

    8. **绘图缓存**:为了提高性能,有时需要使用BitmapDrawable或硬件加速来缓存View的绘制结果。 9. **复用和优化**:考虑重用现有的View和ViewGroup,以及避免在onDraw()中进行昂贵的操作,如计算或网络请求。 10....

    android 自定义view drawable

    总的来说,掌握自定义View和Drawable的使用是提升Android开发能力的重要一环,它能够帮助开发者创造出更具个性化的用户界面,提供更佳的用户体验。通过不断地实践和学习,开发者可以更加熟练地运用这些技术,实现更...

    Android-用于涂鸦的自定义AndroidView

    标题提到的“Android-用于涂鸦的自定义Android View”是指开发者创建了一个专门用于用户涂鸦的自定义视图类,它允许用户在屏幕上自由绘制线条、图形,提供了类似于涂鸦板的功能。这种自定义View通常是通过继承...

    Android自定义view,实现多画面播放器

    1. 视频加载:可以使用Android的MediaPlayer类加载和播放视频,或者使用更高级的库如ExoPlayer,它提供了更丰富的功能和更好的性能。 2. 视频渲染:每个视频画面都需要一个SurfaceView或者TextureView来显示。...

    android开发随声音大小变化的自定义view

    在这个方法内,我们可以使用`Canvas`对象进行绘图操作,如画线、画圆等,来展示声音的大小。 2. 绘制图形: - 对于长方形和圆柱形,我们可以使用`RectF`和`Path`对象来创建形状。例如,长方形可以通过绘制矩形,...

    android汽车仪表view

    总结,这个“android汽车仪表view”项目展示了Android自定义View的强大功能,结合了绘图、动画、数据绑定和性能优化等多个技术点。通过深入理解这些概念和实践,开发者可以创建出更多富有创新和个性化的用户界面。在...

Global site tag (gtag.js) - Google Analytics