Android组件Activity中的View绘画和动画(Animation)是否会重画?

Activity 就是Android中的活动,是Android系统中唯一一个可见组件。

Activity中官网中有一句话:

The visible
lifetime of an activity happens between a call to onStart() until
a corresponding call to onStop()

这句话的意思是可以看见Activity的生命周期是从 调用onStart()方法开始 直到调用onStop()方法。这句话开始我就理解错误了。因为设置Activity的layout的方法如:setContentView(R.layout.main);一般设置在onCreate()方法中,我会认为onCreate()中最对Activity中的View进行一系列的绘画操作,从而从onStart()方法开始显示R.layout.main中view直到onStop()。现在才明白了这句话的意思从onStart()方法,Activity开始显现直到onStop()方法开始隐藏。

View中绘画机制是先简单总结一下:先测量measure,再布局layout,最后画draw到屏幕上。关系图如下:

上面的方法在执行过程中会调用下面相应的方法,所以在自定义单个View过程中,重写下面的onMeasure(),onLayout(),onDraw()方法。

我以前一直以为View的测量,布局,绘画的功能是从onStart()方法完成的,到底是怎样呢,我们实验一下:

现在,我自定义一个ImageView的子类控件CaiImageView来研究一下View从Activity中的某个方法中开始绘画过程,重写下面三个方法如下:

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

System.out.println("CaiImageView onMeasure");

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

}

@Override

protected void onLayout(boolean changed, int left, int top, int right,

int bottom) {

System.out.println("CaiImageView onLayout");

super.onLayout(changed, left, top, right, bottom);

}

@Override

protected void onDraw(Canvas canvas) {

System.out.println("CaiImageView onDraw");

super.onDraw(canvas);

}

Activity中重写如下几个方法如下:

@Override

protected void onStart() {

System.out.println("Activity onStart");

super.onStart();

}

@Override

protected void onResume() {

System.out.println("Activity onResume");

super.onResume();

}

@Override

protected void onPause() {

System.out.println("Activity onPause");

super.onPause();

}

程序的执行过程如下:

Activity中的onResume()方法执行完之后才开始对 setContentView(R.layout.main) 中的R.layout.main开始进行测量,布局,绘画。为什么会多次调用onMeasure()和onLayout(),以后再写博客探讨一下。

如果想得到某个View宽和高,或者测量的宽和高,开始一直以为从onStart()方法开始就可以得到,后来发现我又错了,发现直到onPause()方法中才可以得到宽和高。

Android提供了一种补间动画,根据一个View的内容一系列简单的变化(位置的变化,大小的变化,旋转的变化,等等);如TranslateAnimation.

我一直以为View位置的改变就会重新布局,重新绘画。看一下执行结果如下:

从执行的结果来看,在TranslateAnimation执行过程中,不会对View重新进行布局layout,直接对View进行重画。机制可能是取屏幕的图像缓存直接进行重画,不太了解,以后写博客继续探讨。

时间: 2024-10-29 10:45:58

Android组件Activity中的View绘画和动画(Animation)是否会重画?的相关文章

Activity中获取view的高度和宽度为0的原因以及解决方案

在activity中可以调用View.getWidth.View.getHeight().View.getMeasuredWidth() .View.getgetMeasuredHeight()来获得某个view的宽度或高度,但是在onCreate().onStrart().onResume()方法中会返回0,这是应为当前activity所代表的界面还没显示出来没有添加到WindowPhone的DecorView上或要获取的view没有被添加到DecorView上或者该View的visibili

Android组件Activity初探

1.Activity是什么 Activity是Android系统中的四大组件之一,在MVC模式中属于C控制层 M(Model 模型):Model是应用程序的主体对象.       V(View 视图):是应用程序中负责生成用户界面的部分,使用XML作为编程语言.       C(Controller控制层)android的控制层的重任就要落在众多的activity的肩上了,所以在这里就要建议大家不要在activity中写太多的代码,尽量能过activity交割Model业务逻辑层处理. 一个应用

Android 在Activity中对SQLite的操作

注册 package com.scme.ui; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import and

Android笔记——Activity中的回传数据案例(装备选择)

1.创建程序: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:conte

自学Android笔记——Activity中的数据传递案例(用户注册)

1.创建程序activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Line

自学Android笔记——Activity中的回传数据案例(装备选择)

1.创建程序: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:conte

Android笔记——Activity中的数据传递案例(用户注冊)

1.创建程序activity_main: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Line

Android课程---Activity中保存和恢复用户状态

onSaveInstanceState 保存 在暂停之后和保存之前调用 onRestoreInstanceState 恢复 再启动之后和显示之前调用 package com.example.chenshuai.excise; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View;

Android之activity中新建控件

了解了5大布局,我们会发现这些布局都是静态的,如何让系统自动生成控件呢?这就需要activity来帮忙了 今天我们讲的就是用activity新建布局 用案例来说吧! 实现一个输入行和列自动生成表格并生成背景颜色 效果如图 代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/a