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);
}
}
分享到:
相关推荐
1. 创建一个新的Java类,继承自View或已有的View子类(如Button、ImageView等)。 2. 重写构造函数,通常会需要在构造函数中设置初始化参数。 3. 实现onDraw()方法,这是绘制View的核心,通过Canvas对象进行图形绘制...
1. **创建新类**:为了创建自定义View,我们需要创建一个新的Java类,这个类通常会继承自Android的`View`或`ViewGroup`类。在这个例子中,我们可能创建一个名为`CompassView`的类,继承自`View`。 2. **重写构造...
在源码层面,这些旋转方法最终都会调用到`View#updateDisplayListIfDirty()`方法,该方法负责更新View的DisplayList,这是一个优化过的绘图指令列表。当View的状态改变时,DisplayList会被更新并用于渲染,从而提高...
- 自定义View通常通过继承已有的View或 ViewGroup 类,如在本项目中,可能会继承自`View`类。 - 需要重写`onDraw()`方法,这是绘制View的主要入口,所有图形绘制都在这里进行。 2. **图形绘制**: - 使用`Canvas...
`onDraw()`方法是Android系统调用来绘制View的地方,我们在其中可以使用`Canvas`对象进行绘图。 1. 继承View 创建一个新的Java类,继承自`View`,并在构造函数中设置必要的初始化参数。例如,可能需要设置画布的...
在这个方法中,你可以使用Canvas对象进行绘图,如绘制线条、形状、文本等。例如: ```java @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 在这里进行绘制操作 } ``` 4. 如果...
开发者可以在这个方法中使用Canvas对象进行绘图操作,如绘制文本、图片、形状等。`drawRect()`, `drawText()`, `drawBitmap()`等是常用的绘图API。 自定义ViewGroup时,需要重写这些方法以实现特定的布局逻辑。例如...
在Android中,自定义View是通过继承View或者ViewGroup类并重写其onDraw()方法来实现的。在这个项目中,你需要创建一个新的View类,包含绘制图片、应用高斯模糊和设置毛玻璃效果的方法。关键步骤包括: 1. 初始化:...
一个自定义View通常继承自Android的View或者ViewGroup类。如果我们的控件是单一的,如一个按钮或文本框,那么我们选择继承View;如果需要包含多个子视图并管理它们的布局,那么应该继承ViewGroup,如LinearLayout或...
1. **自定义View的基本原理**:自定义View通常基于`View`或`ViewGroup`类进行扩展,通过重写关键方法如`onDraw()`、`onMeasure()`和`onLayout()`来实现绘图逻辑和布局管理。理解这些方法的生命周期和工作原理是创建...
在`onDraw()`里,我们使用`Canvas`对象进行绘图操作,例如画圆、线段等,来模拟雷达扫描的效果。 雷达扫描通常包含以下几个关键元素: 1. 中心点:雷达扫描通常以屏幕中心为原点,所以我们需要确定这个中心点。 2. ...
在`onDraw()`中,我们可以使用Canvas对象提供的绘图API,如`drawRect()`, `drawCircle()`, `drawText()`等。这些方法接受矩形、圆心或文本的位置参数,这些位置参数就是基于当前View的坐标系统。 例如,要在一个...
2. **重写onDraw()方法**:这是绘制View的核心,使用`Canvas`对象进行绘图操作,如画线、矩形、文本等。 3. **测量尺寸**:通过重写`onMeasure()`方法来确定自定义View的大小。遵循MeasureSpec规则,确保View能在...
总结来说,Android自定义View的实现涉及多个方面,包括继承基类、重写绘图方法、定义和使用自定义属性、处理触摸事件等。通过这些技巧,开发者可以构建出强大且灵活的组件,为应用带来独特的视觉效果和交互体验。而...
8. **绘图缓存**:为了提高性能,有时需要使用BitmapDrawable或硬件加速来缓存View的绘制结果。 9. **复用和优化**:考虑重用现有的View和ViewGroup,以及避免在onDraw()中进行昂贵的操作,如计算或网络请求。 10....
总的来说,掌握自定义View和Drawable的使用是提升Android开发能力的重要一环,它能够帮助开发者创造出更具个性化的用户界面,提供更佳的用户体验。通过不断地实践和学习,开发者可以更加熟练地运用这些技术,实现更...
标题提到的“Android-用于涂鸦的自定义Android View”是指开发者创建了一个专门用于用户涂鸦的自定义视图类,它允许用户在屏幕上自由绘制线条、图形,提供了类似于涂鸦板的功能。这种自定义View通常是通过继承...
1. 视频加载:可以使用Android的MediaPlayer类加载和播放视频,或者使用更高级的库如ExoPlayer,它提供了更丰富的功能和更好的性能。 2. 视频渲染:每个视频画面都需要一个SurfaceView或者TextureView来显示。...
在这个方法内,我们可以使用`Canvas`对象进行绘图操作,如画线、画圆等,来展示声音的大小。 2. 绘制图形: - 对于长方形和圆柱形,我们可以使用`RectF`和`Path`对象来创建形状。例如,长方形可以通过绘制矩形,...
总结,这个“android汽车仪表view”项目展示了Android自定义View的强大功能,结合了绘图、动画、数据绑定和性能优化等多个技术点。通过深入理解这些概念和实践,开发者可以创建出更多富有创新和个性化的用户界面。在...