`
- 浏览:
64193 次
-
Android中对View的更新有很多种方式,使用时要区分不同的应用场合。我感觉最要紧的是分清:多线程和双缓冲的使用情况。1.不使用多线程和双缓冲 这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。2.使用多线程和不使用双缓冲 这种情况需要开启新的线程,新开的线程就不好访问View对象了。强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the original
thread that created a view hierarchy can touch its views. 这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Message msg)方法。android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量,
你可以直接调用View对象中的invalidate()方法 )。也就是说:在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息。3.使用多线程和双缓冲 Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以定义一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得。。invalidate()函数重绘
-
public class PuzzleView extends View {
-
@Override
-
protected void onDraw(Canvas canvas) {
-
...
-
}
-
-
@Override
-
public boolean onTouchEvent(MotionEvent event) {
-
invalidate();
-
//处理逻辑
-
invalidate(); //刷
-
}
-
}
复制代码
当调用线程处于空闲状态时,会调用onDraw,刷新界面,也就是说,该函数仅是标记当前界面过期,并不直接负责刷新界面()
-
public class PuzzleView extends SurfaceView implements SurfaceHolder.Callback{
-
private SurfaceHolder surfaceHolder;
-
-
public PuzzleView(Context context){
-
//....
-
surfaceHolder = this.getHolder();//获取holder
-
surfaceHolder.addCallback(this);
-
}
-
-
protected void paint(Canvas canvas) {
-
//这里的代码跟继承View时OnDraw中一样
-
}
-
-
public void repaint() {
-
Canvas c = null;
-
try {
-
c = surfaceHolder.lockCanvas();
-
paint(c);
-
} finally {
-
if (c != null) {
-
surfaceHolder.unlockCanvasAndPost(c);
-
}
-
}
-
}
-
}
Android中对View的更新有很多种方式,使用时要区分不同的应用场合。我感觉最要紧的是分清:多线程和双缓冲的使用情况。1.不使用多线程和双缓冲 这种情况最简单了,一般只是希望在View发生改变时对UI进行重绘。你只需在Activity中显式地调用View对象中的invalidate()方法即可。系统会自动调用 View的onDraw()方法。2.使用多线程和不使用双缓冲 这种情况需要开启新的线程,新开的线程就不好访问View对象了。强行访问的话会报:android.view.ViewRoot$CalledFromWrongThreadException:Only the original
thread that created a view hierarchy can touch its views. 这时候你需要创建一个继承了android.os.Handler的子类,并重写handleMessage(Message msg)方法。android.os.Handler是能发送和处理消息的,你需要在Activity中发出更新UI的消息,然后再你的Handler(可以使用匿名内部类)中处理消息(因为匿名内部类可以访问父类变量,
你可以直接调用View对象中的invalidate()方法 )。也就是说:在新线程创建并发送一个Message,然后再主线程中捕获、处理该消息。3.使用多线程和双缓冲 Android中SurfaceView是View的子类,她同时也实现了双缓冲。你可以定义一个她的子类并实现SurfaceHolder.Callback接口。由于实现SurfaceHolder.Callback接口,新线程就不需要android.os.Handler帮忙了。SurfaceHolder中lockCanvas()方法可以锁定画布,绘制玩新的图像后调用unlockCanvasAndPost(canvas)解锁(显示),还是比较方便得。。invalidate()函数重绘
-
public class PuzzleView extends View {
-
@Override
-
protected void onDraw(Canvas canvas) {
-
...
-
}
-
-
@Override
-
public boolean onTouchEvent(MotionEvent event) {
-
invalidate();
-
//处理逻辑
-
invalidate(); //刷
-
}
-
}
复制代码
当调用线程处于空闲状态时,会调用onDraw,刷新界面,也就是说,该函数仅是标记当前界面过期,并不直接负责刷新界面()
-
public class PuzzleView extends SurfaceView implements SurfaceHolder.Callback{
-
private SurfaceHolder surfaceHolder;
-
-
public PuzzleView(Context context){
-
//....
-
surfaceHolder = this.getHolder();//获取holder
-
surfaceHolder.addCallback(this);
-
}
-
-
protected void paint(Canvas canvas) {
-
//这里的代码跟继承View时OnDraw中一样
-
}
-
-
public void repaint() {
-
Canvas c = null;
-
try {
-
c = surfaceHolder.lockCanvas();
-
paint(c);
-
} finally {
-
if (c != null) {
-
surfaceHolder.unlockCanvasAndPost(c);
-
}
-
}
-
}
-
}
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
本文实例讲述了Android View刷新机制。分享给大家供大家参考,具体如下: 一、总体说明 在Android的布局体系中,父View负责刷新、布局显示子View;而当子View需要刷新时,则是通知父View来完成。 二、代码分析 1)....
在Android开发中,自定义View是一项重要的技能,它允许开发者扩展Android系统提供的基本视图组件,以满足项目中独特的需求。本篇文章将深入探讨如何基于鸿洋大神的博客内容,创建一个自定义的验证码View。 验证码的...
在Android开发中,自定义可拖拽View是一个常见的需求,比如创建浮动操作按钮、可移动的图片视图等。在本文中,我们将深入探讨如何实现一个可拖拽的ImageView,并解决在界面渲染刷新后,该View不会自动回到起始位置的...
android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.SwipeRefreshLayout> ``` 3. **代码实现**: - 初始化...
android:id="@+id/pull_list_view" android:layout_width="match_parent" android:layout_height="match_parent" app:refreshingDrawable="@drawable/refresh_progress" <!-- 自定义刷新动画 --> app:...
Android界面动态刷新主要依赖于View和ViewGroup类的生命周期方法,以及一些特定的UI更新工具。以下是一些核心知识点: 1. `invalidate()`: 这是Android中用于触发视图重新绘制的关键方法。当你改变了一个View的状态...
Android 圆弧刷新动画 ...Android 圆弧刷新动画的实现需要结合 canvas 的 drawArc 方法、圆弧的位置确定和自定义 View 的 onMeasure 方法。通过掌握这些知识点,可以轻松实现一个简单的 Android 圆弧刷新动画。
在Android开发中,"下拉刷新"和"上拉加载更多"是移动应用常见的功能,尤其是在数据列表场景中。这两个特性极大地提升了用户体验,允许用户在滚动到底部时加载更多数据,或者在顶部拉动时更新列表内容。下面我们将...
本教程将指导你在Android Studio中为ListView实现下拉刷新功能。 1. **下拉刷新概念** 下拉刷新(Pull-to-Refresh)是一种常见的UI设计模式,允许用户通过从列表顶部向下拉动来触发数据的更新。这种功能常见于新闻...
在Android开发中,"下拉刷新"是一种常见的用户体验设计,让用户能够通过在列表或滚动视图的顶部向下拉动来获取最新数据。Google为Android开发者提供了一套完整的解决方案,即SwipeRefreshLayout,来实现这一功能。...
标题中的“Android下拉刷新与上拉加载适用任何的view”指的是开发人员可以为各种类型的视图组件添加这种交互功能。这通常涉及到自定义View或ViewGroup的操作,因为Android的SDK并未提供直接支持所有视图类型的下拉...
在Android开发中,"下拉刷新"是一种常见的用户交互功能,允许用户通过在列表顶部向下拉动来获取最新的数据。这个功能极大地提升了应用的用户体验,让用户能够实时获取到更新的信息。在本项目中,你将找到一个可以...
在安卓(Android)应用开发中,用户界面的交互体验至关重要,而刷新按钮的动画效果是提升用户体验的一个关键因素。在本教程中,我们将探讨如何在Android工具栏中实现一个点击后由单箭头变为旋转圆圈的刷新按钮动画...
综上所述,Android中的下拉刷新、上拉加载和滑动删除功能极大地提高了用户体验。通过SwipeRefreshLayout、自定义OnScrollListener以及第三方库,我们可以轻松地在ListView中实现这些功能,使应用更加人性化和互动。...
在“android自定义view之刷新验证码”这个主题中,我们将深入探讨如何利用自定义View来实现一个可刷新的验证码显示组件。验证码通常用于验证用户身份,防止机器人或者恶意软件的自动操作,确保数据安全。 首先,...
在Android应用开发中,"通用下拉刷新"是一种常见的组件功能,它允许用户通过下拉列表来刷新数据。这个功能通常被用在ListView、RecyclerView等滚动视图中,以实现数据实时更新。XRefreshView是可能的一个开源库,...
SwipeRefreshLayout包含一个子View,通常是一个滚动视图如ListView或RecyclerView,当用户下拉时,SwipeRefreshLayout会显示一个刷新指示器,然后开发者可以通过监听刷新事件来更新数据。 2. 上拉加载更多(Load ...
在Android应用开发中,"下拉刷新"是一个常见的功能,特别是在列表或滚动视图中,用户可以通过下拉操作来更新内容。这个"android下拉刷新demo"是一个示例项目,用于展示如何在Android应用程序中实现这一特性。让我们...
Android 自定义 View 实现转盘旋转的效果 Android 的自定义 View 为开发者定义和使用个性化的 View 提供了很好的支持,想要使用自己定义的 View,需要继承 View 类,并重写构造函数和 onDraw() 函数。onDraw 函数...