Android图形显示系统——一张图片的显示流程

Android设备上一张图片的显示过程

应用示例

假如我们现在有一张这样的风景照

想在Android设备(比如一个小米pad)上显示出来。首先想到的是写一个应用,用一个ImageView,把这张照片附到ImageView上显示,如下面的demo。

MainActivity.java

package com.example.pictureshow;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

activity_main.xml:

<RelativeLayout 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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.pictureshow.MainActivity" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:src="@drawable/background" />
</RelativeLayout>

这个demo的显示效果是这样的:

显示流程

其过程是这样的

整个过程可分为三步:
第一步,得到位图(Bitmap)的内存数据,即从相应的图片文件解码,得到数据放并放到内存。
第二步,使用某种2D引擎,将位图内存按一定方式,渲染到可用于显示的图形内存(GraphicBuffer)上。
第三步,由一个中心显示控制器(Surfaceflinger),将相应的图形内存投放到显示屏(LCD)。

从图片文件到位图

1、找到合适的图片文件
当把风景图片放在drawable目录时,Android系统中会根据设备的分辨率,去相应分辨率的目录选择图片文件。

时间: 2024-10-26 06:04:42

Android图形显示系统——一张图片的显示流程的相关文章

Android图形显示系统——概述

序 Android的图形显示系统,虽然感觉自己基本了解了,有问题基本都能解决,但要写时,一是觉得千头万绪无从下笔,一是发现还有很多并没有真正搞懂.开工写这套体系,也顺便查漏补缺下. Android图形显示系统的剖分 图形显示系统就像一个报社,它派出记者去采访,记者写成文稿后,将记者们交上来的文稿审核.排版.印刷,最终形成一期又一期报纸. 如上是Android图形显示系统的一个全貌图.每个Layer对应着一个Surface.Surface 由每个需要显示的进程View树创建(View树本身对应一个

android调用系统通讯录号码全显示

问题描述 android调用系统通讯录号码全显示 各位大牛,android调用系统通讯录时如何让号码全显示出来?默认是只显示姓名的,如图1,怎么弄成图2的效果,淘宝.京东等的手机充值选择号码都用图2的界面,而且和系统通讯录风格一致,应该不是自定义的通讯录. 解决方案 android调用系统通讯录android 内容提供者 系统通讯录iOS开发调用系统通讯录获取电话号码

Android图形显示系统——下层显示3:窗口系统

Android之窗口系统 要点 1.Android窗口系统通过C-S架构和一套Buffer循环机制实现,在保证安全稳定的前提下基本上做到了极致性能(无大块内存拷贝,IPC通信内容最少). 2.SurfaceFlinger创建Layer,将其中的BufferQueueProducer作为IGraphicBufferProducer传给应用侧的Surface,因而构成窗口. 3.Surface是皮,BufferQueue是肉,通过这样的皮肉关系构建了Buffer循环机制.Buffer循环机制不仅用于

Android图形显示系统——下层显示4:图层合成下(硬件合成器)

硬件合成器-HwComposer 使用3D合成,需要大面积的像素混合计算和大量的内存传输(GPU读写GraphicBuffer所需),对GPU和DDR来说是一个巨大的负担.在GPU/DDR重度使用的场景(比如玩游戏),会造成发热.卡顿等. 为了提升性能,减少功耗,可以将合成这个过程交由另一个芯片完成,减轻GPU负担.进一步,直接让这个芯片连LCD,在LCD需要显示某一行时在线合成. HwComposer便是这一个/多个专用合成芯片的驱动HAL层. 驱动由集成芯片系统的厂商自行设计,但需要遵循一定

Android图形显示系统——上层显示2:硬件加速实现

Android界面绘制的硬件加速实现 Android的界面绘制的硬件加速采取上下整合的一套流程实现 一.代码结构 (一)Java HardwareRenderer->ThreadedRenderer:组织硬件加速渲染的类,下发创建显示列表和回放的指令. GLES20RecordngCanvas GLES20Canvas HardWareCanvas:与Canvas平级的UI渲染引擎支持,但这个Canvas只能存储命令到显示列表中,并在ThreadedRenderer中的渲染线程辅助下运行. Re

Android图形显示系统——下层显示4:图层合成上(合成原理与3D合成)

Android显示之图层合成 要点 1.图层合成指综合各个窗口的绘制内容,送往LCD显示的过程.从原理上可分为在线合成与离线合成两种方式. 2.在Android的SurfaceFlinger代码流程中,图层合成方式分3D合成(OpenGL)和硬件合成两大类. 3.图形系统采用垂直同步Vsync机制,由LCD上报vsync,触发图层合成. 图层合成的原理 什么是图层合成 以Android原生版本的Launcher为例,这个场景下有四个图层,状态栏.导航栏由SystemUI绘制,壁纸由壁纸服务提供,

图片-android 4.0中 WebP不显示问题(不考虑4.0以下系统)

问题描述 android 4.0中 WebP不显示问题(不考虑4.0以下系统) 由于图片太大,我们项目中使用了webp格式的图片,在适配三星s2,4.0系统的时候出现了这种问题,部分webp图片可以显示,一部分webp图片不显示,但是在4.3以上的手机测试时都没有问题,不知道怎么回事,有没有大神帮解答下!谢谢! 解决方案 Android4.0 Toast显示问题Android 4.0 系统语言预设问题android 4.0 显示系统

Android实现从网络获取图片显示并保存到SD卡的方法_Android

本文实例讲述了Android实现从网络获取图片显示并保存到SD卡的方法.分享给大家供大家参考,具体如下: 问题: 如何不断获取图片并显示出来,达到视频的效果? 代码: public class GetPictureFromInternetActivity extends Activity { private ImageView imageView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInst

Android Init进程对信号的处理流程详细介绍

Android  Init进程对信号的处理流程 在Android中,当一个进程退出(exit())时,会向它的父进程发送一个SIGCHLD信号.父进程收到该信号后,会释放分配给该子进程的系统资源:并且父进程需要调用wait()或waitpid()等待子进程结束.如果父进程没有做这种处理,且父进程初始化时也没有调用signal(SIGCHLD, SIG_IGN)来显示忽略对SIGCHLD的处理,这时子进程将一直保持当前的退出状态,不会完全退出.这样的子进程不能被调度,所做的只是在进程列表中占据一个