android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用。
想写一个复杂一点的游戏,是必须用到SurfaceView来开发的,不要老想着用Layout和view去实现,不要将某个游戏
中的对象做成一个组件来处理。应该尽量想着在Canvas(画布)中画出游戏戏中的背景、人物、动画等.
android 开发文档
引用
public void invalidate()
Invalidate the whole view. If the view is visible, onDraw(Canvas) will be called at some point in the future. This must be called from a UI thread. To call from a non-UI thread, call postInvalidate().
public void postInvalidate ()
Cause an invalidate to happen on a subsequent cycle through the event loop. Use this to invalidate the View from a non-UI thread.
示例:
gameview
public class GameView extends View
{
int miCount = 0;
int y = 0;
public GameView(Context context)
{
super(context);
}
//
//具体绘图内容我们紧接着就会讲
public void onDraw(Canvas canvas)
{
if (miCount < 100)
{
miCount++;
}
else
{
miCount = 0;
}
//绘图
Paint mPaint = new Paint();
switch (miCount%4)
{
case 0:
mPaint.setColor(Color.BLUE);
break;
case 1:
mPaint.setColor(Color.GREEN);
break;
case 2:
mPaint.setColor(Color.RED);
break;
case 3:
mPaint.setColor(Color.YELLOW);
break;
default:
mPaint.setColor(Color.WHITE);
break;
}
//绘制矩形--后面我们将详细讲解
canvas.drawRect((320-80)/2, y, (320-80)/2+80, y+40, mPaint);
}
}
第一个重绘方法
public class Activity01 extends Activity
{
private static final int REFRESH = 0x000001;
/* 声明GameView类对象 */
private GameView mGameView = null;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
/* 实例化GameView对象 */
this.mGameView = new GameView(this);
// 设置显示为我们自定义的View(GameView)
setContentView(mGameView);
// 开启线程
new Thread(new GameThread()).start();
}
Handler myHandler = new Handler()
{
//接收到消息后处理
public void handleMessage(Message msg)
{
switch (msg.what)
{
case Activity01.REFRESH:
mGameView.invalidate();
break;
}
super.handleMessage(msg);
}
};
class GameThread implements Runnable
{
public void run()
{
while (!Thread.currentThread().isInterrupted())
{
Message message = new Message();
message.what = Activity01.REFRESH;
//发送消息
Activity01.this.myHandler.sendMessage(message);
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
}
}
}
//详细事件处理见第三章
//当然这些事件也可以写在GameView中
//触笔事件
public boolean onTouchEvent(MotionEvent event)
{
return true;
}
//按键按下事件
public boolean onKeyDown(int keyCode, KeyEvent event)
{
return true;
}
//按键弹起事件
public boolean onKeyUp(int keyCode, KeyEvent event)
{
switch (keyCode)
{
//上方向键
case KeyEvent.KEYCODE_DPAD_UP:
mGameView.y-=3;
break;
//下方向键
case KeyEvent.KEYCODE_DPAD_DOWN:
mGameView.y+=3;
break;
}
return false;
}
public boolean onKeyMultiple(int keyCode, int repeatCount, KeyEvent event)
{
return true;
}
}
第二种方法
class GameThread implements Runnable
{
public void run()
{
while (!Thread.currentThread().isInterrupted())
{
try
{
Thread.sleep(100);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
}
//使用postInvalidate可以直接在线程中更新界面
mGameView.postInvalidate();
}
}
}
分享到:
相关推荐
当地图数据发生变化时,可以通过调用`invalidate()`或`postInvalidate()`方法请求重绘。`invalidate()`会立即触发`onDraw()`,而`postInvalidate()`则会在UI线程的下一次遍历时执行。 二、自定义ViewGroup 自定义...
在Android开发中,View的旋转是一项常见的操作,用于实现各种动态效果或用户交互。本文将深入探讨Android View...在实际编程过程中,还需要注意性能优化,合理利用硬件加速以及避免不必要的重绘,以保证应用的流畅性。
- **invalidate()**和`postInvalidate()`:这两个方法用于触发View的重绘。当View的状态改变需要更新界面时,调用它们通知系统View需要重新绘制。 - **Choreographer**:Android系统的动画和绘制调度器,负责协调...
`invalidate()`方法是触发View重绘的关键。当调用`invalidate()`时,Android系统会把该View添加到待绘制队列中,稍后在UI线程的空闲时间进行重绘。这个过程会重新执行上述的测量、布局和绘制三个步骤。`invalidate()...
可以使用硬件加速(`setLayerType(View.LAYER_TYPE_HARDWARE, null)`),避免不必要的重绘(`setWillNotDraw(false)`或`setWillNotDraw(true)`),以及合理使用`invalidate()`来仅刷新需要更新的部分。 7. **绘图...
1. 减少不必要的重绘:合理使用View的可见性属性,避免在不需要绘制的地方调用invalidate()。 2. 使用硬件加速:开启硬件加速可以提高View的绘制性能,但并非所有情况都适用,需谨慎使用。 3. 适当使用ViewStub:当...
比如,如果扫描线只在一定范围内移动,那么我们只需要重绘这部分区域,而不是整个View。这可以通过`clipRect()`方法实现。 最后,作者可能分享了如何在布局文件中添加自定义View,并在运行时根据需要调整参数,如...
在优化性能时,避免频繁操作根View,以减少不必要的布局重绘,提高应用效率。 在提供的“RootActivity”示例中,可能包含了一个展示如何获取和使用根View的Activity实例。通过阅读源代码,开发者可以更深入地理解...
在Android开发中,我们使用自定义View来实现Checkbox的重绘。首先,我们需要创建一个新的类,继承自`AppCompatCheckBox`或`CompoundButton`。然后,我们覆盖`onDraw()`方法,这是绘制View的核心函数。在这个方法里,...
可以通过`invalidate()`或`postInvalidate()`方法请求重绘View,以反映温度变化。 5. **布局与测量**: - 在`onMeasure()`方法中,我们需要指定自定义View的大小。可以根据需求设置固定尺寸或者基于内容计算尺寸。...
例如,减少不必要的重绘,避免在主线程进行耗时操作等。 在`awesome-view-master`这个项目中,你可能会发现各种自定义View的示例,它们涵盖了上述提到的技术点,包括自定义图形绘制、触摸事件处理、动画实现等。...
可以考虑使用`postInvalidate()`而不是`invalidate()`来避免不必要的重绘,或者使用`ObjectAnimator`来平滑地过渡动画效果。 6. 将自定义View添加到布局: - 在XML布局文件中,将自定义View包含进来,指定其宽度、...
避免不必要的重绘,使用硬件加速,合理使用Bitmap缓存,以及利用View的复用机制(例如,RecyclerView的ViewHolder模式)都是提高性能的关键。 6. **源码分析**:标签中的"android view 源码"暗示这个资源可能包含对...
可以通过使用硬件加速、延迟渲染、减少不必要的重绘等方式提升用户体验。例如,可以将连续的触摸轨迹合并为一条路径,减少onDraw()的调用次数。 7. **状态管理与撤销/重做功能**: 虽然描述中没有提及,但一个完善的...
由于自定义View需要频繁重绘,特别是在动画运行时,性能优化是必要的。开发者可能使用`invalidate()`方法合理地请求重绘,避免不必要的计算。同时,通过使用硬件加速和避免在`onDraw()`中执行耗时操作,可以提高...
"画布的重绘和保存"这个主题主要涉及如何在Android应用中使用Canvas进行动态绘制,并将结果保存为图像文件。下面将详细阐述相关知识点。 首先,我们来看画布(Canvas)的基本概念。Canvas是Android提供的一个类,...
可能使用`invalidate()`来仅重绘必要部分,或者使用`postInvalidate()`在UI线程空闲时再进行绘制。 8. **测试与调试**:最后,开发者需要在不同设备和Android版本上进行测试,确保自定义View的兼容性和效果一致性。...
当进度值改变时,可以调用`invalidate()`方法触发视图重绘,这样`onDraw()`就会再次执行,更新进度条的显示。 此外,我们还可以添加触摸事件监听器,使用户可以通过滑动手指来改变进度。通过重写`onTouchEvent()`...
/* 设置数字,并通知View重绘 */ } } ``` 接下来,你可以在需要的地方动态添加这个`BadgeView`到你的布局中,或者通过查找已存在的View并设置`BadgeView`作为其子View。使用`ViewGroup.addView()`方法来添加,...