精华内容
下载资源
问答
  • uml时序图概念描述

    千次阅读 2017-02-06 11:54:19
    uml时序图描述

    时序图(Sequence Diagram):描述了系统在参与者的动作下,内部多个对象之间的动态协作。

    时序图的主要构成有:角色、对象、生命线、控制焦点、消息、自关联消息以及组合片段(交互片段)。

    一、角色(Actor)

    用以表示和系统进行交互的参与者角色,不一定是人也可以是物或者系统。

    UML用例图中用一个小人来表示角色


    二、对象(Object)

    对象就是类的实例。

    UML用例图中用矩形框来表示对象。


    三、生命线(Lifeline)

    生命线代表对象在某一用例中的生命周期。
    UML用例图中用虚线来表示生命线。


    四、控制焦点(Focus of Control)

    控制焦点代表对象在某一用例过程中执行某一操作的时间。

    UML用例图中用方块来表示控制焦点。


    五、消息(Message)

    消息是角色和对象或者对象与对象之间的信息传递。

    消息分为三种:同步消息、异步消息、返回消息。

    1、同步消息:

    把信息传递给接受者后,停止活动,等待返回结果。

    UML图表示如下:

    2、异步消息

    把信息传递给接受者后,不用等待返回结果。可以直接开始下一个活动。

    UML图表示如下:

    3、返回消息

    代表从过程调用返回。

    UML图表示如下:


    六、自关联消息(Self-Message)

    自关联消息表示方法的自身调用或者一个对象内的一个方法调用另外一个方法。

    UML图表示如下:

    七、组合片段(Combined Fragments)/交互片段(interaction fragment)

    UML图(以Alternative为例)表示如下:


    可选择的组合有:


    alt:在一组行为中根据特定的条件选择某个交互;
    opt:表示一个可选的行为;
    break:提供了和编程语言中的break类拟的机制;
    par:支持交互片段的并发执行;
    seq:强迫交互按照特定的顺序执行;
    strict:明确定义了一组交互片段的执行顺序;
    neg:用来标志不应该发生的交互;
    region:标志在组合片段中先于其他交互片断发生的交互;
    ignore:明确定义了交互片段不应该响应的消息;
    consider:明确标志了应该被处理的消息
    assert:标志了在交互片段中作为事件唯一的合法继续者的操作数;
    loop:说明交互片段会被重复执行 


    绘图工具说明:PowerDesigner 16。

    备注
    转载请注明出处:http://blog.csdn.NET/wsyw126/article/details/51352801
    作者:WSYW126

    展开全文
  • Speex之二-编码描述及相关概念解析

    千次阅读 2012-04-24 17:01:09
    编码描述 这一章节将描述Speex更为详细特征 1. 概念 在介绍全部Speex特征之前,这里有一些语音编码的概念以帮助更好地理解本手册。虽然有一些是语音/音频处理的概念,其它是特殊于Speex的(译得怪怪的)  采样率 ...


    编码描述

    这一章节将描述Speex更为详细特征

    1. 概念

    在介绍全部Speex特征之前,这里有一些语音编码的概念以帮助更好地理解本手册。虽然有一些是语音/音频处理的概念,其它是特殊于Speex的(译得怪怪的)

     采样率

    采样率使用赫茲(hz)表示,是每一秒钟信号采样的个数。以采样率Fs kHz为例,其最高频率等于Fs/2 kHz(Fs/2 被称为Nyquist频率)。这是信号处理的基本属性,也通过采样定理被描述。Speex 主要被设计为三个不同的采样率:8kHz,16kHz,32kHz。这些分别称为窄带、宽带、超宽带。

     质量(可变的)

    Speex是一种有损编解码器,这意味着它压缩开支在输入语音信号的保真度。不像其它语音编解码器,Speex是可以权衡质量与比特率的。很多时候通过一个从0到10的质量参数来控制Speex编码器。在固定比特率(CBR)操作,质量参数是一个整形,而可变比特率(VBR)其质量参数为浮点型。

     复杂度(可变的)

    Speex编码器复杂度是可变的。这是用一个从1到10的整形来完成对它的控制,这类似于使用-1到-9设置gzip和bzip2压缩工具。复杂度1的噪声水平在1到2分贝之间要高于复杂度10,但复杂度10的CPU要求大约是复杂度1的5倍。在实践中,最好的折衷是在复杂度2到4,尽管当非讲话声音如DTMF,更高的设置经常是有用的。

     可变比特率(VBR)

    可变比特率允许一个编解码器根据不同的语音动态自适应地变化比特率。以Speex为例,声音像元音和高能量瞬时要求一个更高的比特率去达到好的质量,而编码摩擦音(如 s,f发音)会适当较少比特。因此VBR能达到在相同的质量下更低的比特率,或者在相同的比特率下更好的质量。尽管有以上的优点,但VBR有两个主要的缺点:一个是只能指定质量,但不能保证最终平均比特率。另一个是在一些实时应用中像VOIP,最大比特率必须满足通讯通道。

     平均比特率(ABR)

    平均比特率解决了VBR其中的一个问题,为了满足一个明确的目标比特率,用它来动态调节VBR质量。因为质量/比特率是实时调节的,所以全局质量将会稍微低于设置满足于目标平均比特率的VBR质量。

     语音活动性检测(VAD)

    当使能语音活动性检测功能,将检测被编码的语音是讲话或静音/背景噪声。当编码为VBR时VAD总是暗中活动,所以设置只在非VBR有效。在这种情况,Speex在检测非讲话周期和足够的比特率下重建背景噪声,这称为舒适噪声生成(GNG)

     间断传输(DTX)

    间断传输是除了VAD/VBR的一个操作,它允许当只有固定背景噪声时完全停止传输。在文本模式操作,由于我们不能停止写文件,所以每帧只能使用5比特(相当于250bps)

     感知加强

    感知加强是解码器的一部分,开启该功能时试图通过编码/解码处理降低噪声的感知。在很多情况下,感知加强从客观上会使声音与源声音相关更大(只从信噪比角度考虑),但最终声音从主观上会更好。

     延迟与算法延迟

    第一个语音编解码都会介绍传输的时延。Speex的时延等于一帧时间加上处理每一帧向前看需要的时间。窄带(8kHz)的时延是30ms,而宽带(16kHz)是34ms。这些值不计编码或解码所花费CPU的时间。

     3. 预处理器

    这部分参考预处理模型介绍1.1.x分支。预处理器的设计是运行于编码器之前的。预处理器提供了三个

    主要的功能:

    (1)噪声抑制(NS)

    (2)自动增益控制(AGC)

    (3)活动性检测(VAD)

                       插图1 回音消除模型

    噪声抑制(NS)

    噪声抑制器能被用于在发送之前降低输入信号的背景噪声的数量。提供更高质量的语音是否噪声抑制信号或者是根本。无论怎样使用降噪信号是有益的。一般语音编解码(包括Speex)对噪声输入的处理是不足的,会趋向于放大噪声。噪声抑制器很大地降低了这一影响。

     自动增益控制(AGC)

    自动增益控制是处理面对录音因为大量不同设置而导致音量变化。AGC提供了一种方式去调整参考音量。这在VOIP中是很有用的,因为不需再手动调节麦克风的增益。还有另外一个优点是麦克风增益在一个比较保守的水平,它更容易避免削波、失真。

     语音活动性检测(VAD)

    通过预处理提供的语音活动性检测(VAD)会比直接由编解码器提供的更为高级。

     4 自适应抖动缓冲

    当使用UDP或RTP传输语音时,包可能会有丢包、不同时延甚至错序。抖动缓冲的目的就是重排包和缓冲,它们是足够长的(但又不能超过所需),所以他们被发送去解码。

     5. 语音回音消除器

    在任何一个免提通讯系统中(插图1),远端的语音被本地场声播放,传播到整个房间并且被麦克风所采集。如果抓取麦克风的语音直接发送给麦克风,那么远端用户会听到他自己的回声。一个语音回音消除器的设计是在发送去远端之前移除回声。去理解回声消除器意味着改善远端质量是很重要的。

     6. 重采样

    有些情况,转换一个语音的采样率是很有用的。这有很多原因。比如,它能混合不合采样率的流,支持声卡不支持的采样率。这是为什么重采样是Speex工程的一部分。这个重采样能用于转换两个任意采样率(比例必须只能是有理数),而且可以通过权衡质量与复杂度去控制它。

     

     

    原文

    2 Codec description

    This section describes Speex and itsfeatures into more details.

     

    2.1 Concepts

    Before introducing all the Speex features,here are some concepts in speech coding that help better understand the rest ofthe manual. Although some are general concepts in speech/audio processing,others are specific to Speex.

     

    Sampling rate

    The sampling rate expressed in Hertz (Hz)is the number of samples taken from a signal per second. For a sampling rate ofFs kHz, the highest frequency that can be represented is equal to Fs/2 kHz(Fs/2 is known as the Nyquist frequency).

    This is a fundamental property in signalprocessing and is described by the sampling theorem. Speex is mainly designedfor three different sampling rates: 8 kHz, 16 kHz, and 32 kHz. These arerespectively refered to as narrowband, wideband and ultra-wideband.

     

    Bit-rate

    When encoding a speech signal, the bit-rateis defined as the number of bits per unit of time required to encode thespeech. It is measured in bits per second (bps), or generally kilobits persecond. It is important to make the distinction between kilobits per second(kbps) and kilobytes per second (kBps).

     

    Quality (variable)

    Speex is a lossy codec, which means that itachives compression at the expense of fidelity of the input speech signal.Unlike some other speech codecs, it is possible to control the tradeoff madebetween quality and bit-rate. The Speex encoding process is controlled most ofthe time by a quality parameter that ranges from 0 to 10. In constant bit-rate(CBR) operation, the quality parameter is an integer, while for variable bit-rate(VBR), the parameter is a float.

     

    Complexity (variable)

    With Speex, it is possible to vary thecomplexity allowed for the encoder. This is done by controlling how the searchis performed with an integer ranging from 1 to 10 in a way that’s similar to the-1 to -9 options to gzip and bzip2 compression utilities. For normal use, thenoise level at complexity 1 is between 1 and 2 dB higher than at complexity 10,but the CPU requirements for complexity 10 is about 5 times higher than forcomplexity 1. In practice, the best trade-off is between complexity 2 and 4,though higher settings are often useful when encoding non-speech sounds likeDTMF tones.

     

    Variable Bit-Rate (VBR)

    Variable bit-rate (VBR) allows a codec tochange its bit-rate dynamically to adapt to the “difficulty” of the audio beingencoded. In the example of Speex, sounds like vowels and high-energy transientsrequire a higher bit-rate to achieve good quality, while fricatives (e.g. s,fsounds) can be coded adequately with less bits. For this reason, VBR can achivelower bit-rate for the same quality, or a better quality for a certainbit-rate. Despite its advantages, VBR has two main drawbacks: first, by onlyspecifying quality, there’s no guaranty about the final average bit-rate.Second, for some real-time applications like voice over IP (VoIP), what countsis the maximum bit-rate, which must be low enough for the communicationchannel.

     

    Average Bit-Rate (ABR)

    Average bit-rate solves one of the problemsof VBR, as it dynamically adjusts VBR quality in order to meet a specifictarget bit-rate. Because the quality/bit-rate is adjusted in real-time(open-loop), the global quality will be slightly lower than that obtained byencoding in VBR with exactly the right quality setting to meet the target averagebit-rate.

     

    Voice Activity Detection (VAD)

    When enabled, voice activity detectiondetects whether the audio being encoded is speech or silence/background noise.VAD is always implicitly activated when encoding in VBR, so the option is onlyuseful in non-VBR operation. In this case, Speex detects non-speech periods andencode them with just enough bits to reproduce the background noise. This iscalled “comfort noise generation” (CNG).

     

    Discontinuous Transmission (DTX)

    Discontinuous transmission is an additionto VAD/VBR operation, that allows to stop transmitting completely when thebackground noise is stationary. In file-based operation, since we cannot juststop writing to the ?le, only 5 bits are used for such frames (corresponding to250 bps).

     

    Perceptual enhancement

    Perceptual enhancement is a part of thedecoder which, when turned on, attempts to reduce the perception of thenoise/distortion produced by the encoding/decoding process. In most cases,perceptual enhancement brings the sound further from the

    original objectively (e.g. considering onlySNR), but in the end it still sounds better (subjective improvement).

     

    Latency and algorithmic delay

    Every speech codec introduces a delay inthe transmission. For Speex, this delay is equal to the frame size, plus someamount of “look-ahead” required to process each frame. In narrowband operation(8 kHz), the delay is 30 ms, while for wideband (16kHz), the delay is 34 ms.These values don’t account for the CPU time it takes to encode or decode theframes.

     

    3. Preprocessor

    This part refers to the preprocessor moduleintroduced in the 1.1.x branch. The preprocessor is designed to be used on theaudio before running the encoder. The preprocessor provides three mainfunctionalities:

    • noise suppression

    • automatic gain control (AGC)

    • voice activity detection (VAD)

     

    The denoiser can be used to reduce theamount of background noise present in the input signal. This provides higherquality speech whether or not the denoised signal is encoded with Speex (or atall). However, when using the denoised signal with the codec, there is anadditional benefit. Speech codecs in general (Speex included) tend to performpoorly on noisy input, which tends to amplify the noise. The denoiser greatlyreduces this effect.

     

    Automatic gain control (AGC) is a featurethat deals with the fact that the recording volume may vary by a large amountbetween different setups. The AGC provides a way to adjust a signal to areference volume. This is useful for voice over IP because it removes the needfor manual adjustment of the microphone gain. A secondary advantage is that bysetting the microphone gain to a conservative (low) level, it is easier toavoid clipping.

     

    The voice activity detector (VAD) providedby the preprocessor is more advanced than the one directly provided in thecodec.

     

     

    2.4  Adaptive Jitter Buffer

    When transmitting voice (or any content forthat matter) over UDP or RTP, packet may be lost, arrive with differentdelay,or even out of order. The purpose of a jitter buffer is to reorderpackets and buffer them long enough (but no longer than necessary) so they can besent to be decoded.

     

    2.5 Acoustic Echo Canceller

    In any hands-free communication system(Fig. 2.1), speech from the remote end is played in the local loudspeaker,propagates in the room and is captured by the microphone. If the audio capturedfrom the microphone is sent directly to the remote end,then the remove userhears an echo of his voice. An acoustic echo canceller is designed to removethe acoustic echo before it is sent to the remote end. It is important tounderstand that the echo canceller is meant to improve the quality on theremote end.

     

    2.6 Resampler

    In some cases, it may be useful to convertaudio from one sampling rate to another. There are many reasons for that. Itcan be for mixing streams that have different sampling rates, for supportingsampling rates that the soundcard doesn’t support, for transcoding, etc. That’swhy there is now a resampler that is part of the Speex project. This resamplercan be used to convert between any two arbitrary rates (the ratio must only bea rational number) and there is control over the quality/complexity tradeoff。

     

     

    展开全文
  • 多屏幕多分辨率的支持和一些概念

    千次阅读 2012-06-01 16:18:18
    快速预览 Android 在不同的屏幕大小和密度上执行屏幕的显示会影响用户界面的效果...本节为详细的为你解释一些基础概念和教你怎么处理关于多屏幕多分辨率的支持。 虽然系统会根据不同的屏幕来执行缩放和调整你的App

    快速预览

    • Android 在不同的屏幕大小和密度上执行
    • 屏幕的显示会影响用户界面的效果
    • 系统处理大多数的自适应屏幕
    • 你应该针对屏幕创建资源以更好的控制你的UI

     

    Android 是一个系统,运行在这个系统上的很多设备它们的屏幕大小和密度都不一样。但我们需要解决这个问题。本节为详细的为你解释一些基础概念和教你怎么处理关于多屏幕多分辨率的支持。 虽然系统会根据不同的屏幕来执行缩放和调整你的App,但你还是应该自己在加点外力来最大化用户体验的效果。

    多屏幕支持概述

    以下是一些术语和概念,大家要稍微留心看看:

    屏幕大小

    根据屏幕对角线实际测量的物理大小(android已经根据屏幕大小分为四类small, normal, large, extra large)

    屏幕密度

    屏幕物理区域一个单位(一般用英寸)的像素数量,一般简称dpi(每英寸上的点数,记住DPI这个概念很重要)

    这里android也分为四类 low, medium, high, extra high.

    方向

    从用户的角度看设备只有2个方向,那就是横屏和竖屏。关于横竖屏最好也要出一套相对应的UI,因为长宽比不一样,放心难度不是很大。

    分辨率

    一个物理屏幕上像素点的总数。一般我们的App不会直接使用分辨率,而是使用密度和屏幕大小

    独立像素单位(Density-independent pixel (dp))

    一个虚拟的单位,用来定于UI布局的。用来表述布局的尺寸或者位置。

    dip(注 意dip是独立像素单位,dpi是屏幕密度)等价于一个160dpi(mdpi)的屏幕,运行时系统会根据你实际屏幕的密度来自动处理缩放。像素和dip 的转换公式为dp =px*(dpi/160) 。例如在240密度(dpi)的屏幕上一个dp等于1.5个像素(dp=px*1.5)。以后我们应该尽量使用dip单位布局,不要使用像素单位。这样会使你的app屏幕兼容性更好

    多屏幕可以看成是许多Boss,要战胜这些boss有5点我们需要攻破它,分别是屏幕大小,屏幕密度,方向,分辨率,独立像素单位。

    屏幕大小-Boss的外在体型:熟悉每个boss的体型,会让我们采取不同的战术,大的笨重,小的轻巧

    屏幕密度-Boss的密度:别看有个boss体型很小,他密度高,一个俄罗斯梅花坐直接压死你,我们需要知道每个boss的密度。

    方向-Boss的体型比:有的boss矮胖,看上去就像一个游戏手柄,但有些高瘦,看上去就像一根棍子。但记住我们是站着看的,但如果躺着看呢,所以角度不同看出来的结果就可能不一样

    分辨率-boss的可识别度:隔boss近的话分辨率低,只能看到boss的某个部位而且很大,我不知道这是哪个boss;远的话分辨率高,能看到boss的所有部位,哦!原来这个boss就是伊利丹怒风

    独立像素单位-boss的攻击力:每个boss的攻击技能都不太一样,所以我们需要吧所有boss的技能转换为攻击力来方便我们计算对付boss的策略

    多屏幕支持的范围

    android1.6开始就支持多屏幕和密度了,这都是为了更好的用户体验,为了简化我们多屏幕的开发。android提供一组范围让我们使用:

    • 关于屏幕大小: small, normal, large, xlarge(看来目前boss的体型就这四种)

    注意: 关于android3.2会有些不同,以后我们在讲平板和手机支持时会说明

    • 屏幕密度: ldpi (low), mdpi (medium), hdpi (high), xhdpi (extra high) (so 密度也是四种)

    这些广义的大小和密度都是基于normal大小和mdpi来配置的或者说相对论。一般来说我们手机800*480或者854*480 密度都是240(hdpi),屏幕大小为large。

    每一个大小和密度都有一个跨越幅度。但这些幅度中具体的微调我们是不用关心的,android会帮我们处理,下面我们来看图

     

     

    我们设计UI都会要考虑一个最小化的空间,android中都是使用dp(dip)单位的。

    • xlarge 屏幕至少960dp x 720dp
    • large 屏幕至少 640dp x 480dp
    • normal 屏幕至少 470dp x 320dp
    • small 屏幕至少 426dp x 320dp

    屏幕大小和密度是可以独立的,不是说一个5寸屏的密度就一定是hdpi。有一个很重要的例子就是例如一个WVGA (800×480)屏幕可能在不同的设备上会有mdpi和hdpid两种密度,正常的屏幕密度应该是hdpi。但不用担心我们是有办法解决这种问题的。

    就是说boss体型大不一定密度高,万一它里面真空呢。但也不要小看体型小的boss,有可能它里面装的都是金属,你会很纠结怎么打败它。还有一些特殊的boss他体型一样,但密度可以变化,真牛B的boss啊!先来个真空上阵,再直接用铁砸死你。

    独立密度

    维持独立密度是很重要的,因为没有它,一个UI元素(比如一个按钮)会出现在一个物理屏幕很大,但密度很少的显示效果(看起来就是像是被强行放大的,失真很严重)。这样相对位置的改变会出问题

     

    图1是你的App没有支持不同密度产生的效果

     

    图2是具有良好的支持程序为例产生的效果 

    android 系统帮助你的App实现独立密度的方法有两种:

    • 系统缩放dp单位来适用当前屏幕密度The system scales dp units as appropriate for the current screen density
    • 系统基于当前屏幕密度缩放drawable资源到适用的大小

    图 1是用像素单位来定义的大小。 你发现他们的布局完全变了,有的大有的小。这是因为他们的实际屏幕大小可能是一样的,高密度屏幕每英寸的像素更多(所以你会发现像素一样,但高密度的设备显示出来的效果却很小)。图2使用的是dp单位,基于mdpi密度的设备它不会变化,ldpi它会自动缩小,hdpi它会自动放大。所以效果非常好。图片 显示出来的样子和大小完全一样。

    使用密度系统会缩放图片使之看上去完全一样,但细心的你会发现有些图片变模糊了。所以我们应该提供可选择的图片资源让系统来选择以适应不同的密度。所以以后工程项目中hdpi,mdpi,ldpi三个文件夹就是用在这里的。这样就不会有模糊的感觉了,perfect!!

     我们一定要换算boss的攻击力,好躲避技能,它的技能实在太多了,搞不好一口水就能淹死你(强力的攻击啊)。

    怎样支持多屏幕(怎么搞定这么多boss)

    以上我们学习了这么多的理论基础。我们应该优雅的处理它们了。

    • 1.明确的在manifest文件中指出你的App支持的屏幕大小(哈哈,抓到你的小辫子了吧)

    我们可以有选择性的过滤掉一些老掉牙的设备,以减轻我们的工作量。但这并不是一个好的方法仅供参考。在manifest 中使用节点<supports-screens>

    • 2.根据不同的屏幕大小提供不同的布局(我们根据不同的boss体型来换不同的装备应对,暗影系boss需要多穿点暗抗装啊)

    默认的android会调整你App的布局来使用当前设备的屏幕。大多数情况下可以满足,但某些特殊情况,你的UI可能需要一个更精确的调整。例如,一个larger 屏幕,你可能想要利用额外的屏幕控件调整位置和一些元素的大小,或者一个小屏幕中,你可能需要调整到刚好合适。比如你需要适应一个extra large 屏幕。你可以在文件夹layout-xlarge下放置布局(大家记住一般layut下放的都是xml布局文件)

    Android 3.2开始,有一种新的放置方式。例如你的平板需求至少600dp的屏幕宽度,你可以使用layout-sw600dp 这种文件夹放置。以后我们在平板一节会详细描述

    • 3.根据不同的屏幕密度提供不同的位图(根据不同的boss密度来学技能,你敢压我?我有闪避 谢谢!)

    默认android会缩放你的位图(.png.jpg.gif),还有一种android专用的Nine-Patch(.9.png)。例如,你的App提供的位图仅仅为标准密度(mdpi),那么在hdpi的屏幕上这些位置会被等比放大。所以我们应该有选择性的对于不同的屏幕密度包含不同的分辨率。

    所以android针对图片资源配置后缀,前面我们知道的4种密度(ldpi.mdpi,hdpi,xhpi),如果是ldpi 我们应该使用drawable- ldpi这种文件夹。以上关于屏幕大小和密度的后缀都符合屏幕支持的那些范围。

    注意: 如果你没有熟悉的配置后缀, 不知道如何使用它们,没关系。我们以后会在App资源中讲解!

    在运行时, 对于给定资源系统使用以下这些步骤保证你最佳的显示:

    1. 系统会使用合适的替代资源

      基于当前屏幕的大小和密度,系统会针对屏幕的密度和大小使用资源。例如,如果设备有一个 hdpi的屏幕那么当App请求一个drawable 资源时,系统会在最匹配的的设备配置下的drawable 资源目录寻找。可以取决于其他可替代的资源,使用drawable-hdpi的资源目录最匹配的,所以系统会使用drawable-hdpi目录下的资源。

    2. 如果没有可用的匹配资源,系统会使用默认资源等比放大或缩小以匹配当前屏幕的大小和密度。

      这里的默认资源是没有后缀的。例如,“drawable”就是默认的drawable 资源。系统会认为默认的资源都是基于normal 屏幕大小和medium 密度设计的。系统会等比缩放默认的密度资源来匹配hdpi密度或者ldpi密度。当系统没有找到针对密度资源的目录时,它就一直会使用默认的资源。例如,如果系统想找一个ldpi(低密度)的资源,但找不到。那么系统会等比缩小hdpi的资源,为什么不寻找mdpi呢?因为系统对于hdpi更容易缩放,它的系数为0.5,相比mdpi的0.75来说。0.5的的性价比更高(方便计算,正确率也高一点)。关于这一点最好的证明就是android版本的QQ浏览器。你解压后发现它关于drawable就只有drawable和drawable-hdpi两个文件夹,看来腾讯里android的开发者应该很熟悉android系统规律了,因为默认的drawable 就是mdpi,只需要定义一套hdpi的drawable资源就行了。

     

    使用配置后缀

     

    Android支持几种配置后缀,它允许你控制系统有选择性的筛选基于当前屏幕设备的资源文件。一个配置后缀就是一个String你可以在资源目录文件夹下追加指定的后缀即可 。

     

    使用一个配置后缀的方法步骤:

     

    1. 在你的工程res目录下创建一个新的目录,格式为<资源种类名>-<后缀>: 
      • <资源种类名>是标准的资源名字(例如 drawable或者layout)
      • <后缀> 是指定屏幕配置使用哪一种资源(例如hdpi或者xlarge)

      我们可以使用的后缀不仅仅只有一个哦,在一个文件夹下我们可以同时使用多种后缀来限定资源,使用"-"即可。

    2. 在新的目录中保存合适资源,资源文件的命名必须和默认资源文件一样。

     

    例如 xlarge是一个后缀用于extra large 屏幕。当你追加后缀时(例如layout-xlarge) ,它说明系统会在extra large屏幕上使用这些资源

     

    表格1.

     装备,技能齐全啊。求秒杀boss!!!

    屏幕特征 后缀 描述
    大小 small 资源用于small大小的屏幕.
    normal 资源用于normal 大小的屏幕。(这是默认的基准大小)
    large 资源用于large大小的屏幕
    xlarge 资源用于extra large大小的屏幕
    密度 ldpi 资源用于 low-density (ldpi) 密度的屏幕 (~120dpi).
    mdpi 资源用于medium-density (mdpi) 密度的屏幕 (~160dpi). (这是默认的基准密度.)
    hdpi 资源用于high-density (hdpi) 密度的屏幕 (~240dpi).
    xhdpi 资源用于extra high-density (xhdpi) 密度的屏幕 (~320dpi).
    nodpi 资源用于所有密度. 系统不会根据当前屏幕密度去缩放资源
    tvdpi 资源用于mdpi 和hdpi两者之间的某的密度;大约是213dpi。 这个很少用到。它主要用于电视,大多数App不需要用到它。如果你需要tvdpi资源,它的大小大概是1.33*mdpi(160)例如,一个在mdpi下100px*100px的图片,那么在 tvdpi中它会变成133px*133px。
    方向 land 资源用于横屏
    port 资源用于竖屏
    长宽比 long 资源用于长宽比相差很远的配置(相对于4寸(normal)屏幕左右基准屏幕)
    notlong 资源用于长宽比差不多的配置(相对论,同上)

     

    注意: 如果对于android3.2或者更高的版本,有一些新的后缀,等下我们会讲解

    下面我们就来举一些详细的例子

    res/layout/my_layout.xml             // 用于normal 屏幕大小的布局 ("默认")
    res/layout-small/my_layout.xml       // 用于small 屏幕大小的布局
    res/layout-large/my_layout.xml       // 用于large屏幕大小的布局
    res/layout-xlarge/my_layout.xml      // 用于extra large屏幕大小的布局
    res/layout-xlarge-land/my_layout.xml // 于extra large屏幕大小并且是横屏的布局
    
    res/drawable-mdpi/my_icon.png        // 用于中等密度的位图
    res/drawable-hdpi/my_icon.png        // 用于高密度的位图
    res/drawable-xhdpi/my_icon.png       // 用于超高密度的位图
    
    

    当android系统在运行时选择资源时,它会以一定的逻辑判断来匹配最适合的资源。前提是你没有加后缀。当基于使用大小的后缀时,如果当前没有资源更好的匹配你的后缀,那么系统会使用

    比当前屏幕更小的资源来计算(例如,如果你没有添加large后缀,那么一个large大小的屏幕将会使用在normal(默认的)大小的屏幕资源),如果可用的资源后缀比当前屏幕更大(其实还是没匹配

    上),那么系统将不使用它们(例如你吧所有layout资源放入xlarge后缀中,但设备是一个normal屏幕,系统就不会使用这些资源)。

    是不是有点头晕了,简要的概述下就是如果没有匹配的系统会使用默认的资源,如果连默认下都没有放资源并且没有匹配到你的后缀,那么系统就没有资源可用啦。

    注意:某些情况下你可能需要用到nodpi后缀,因为你可能不想要它被缩放,或者你想要在运行时通过代码手动缩放它。

     

    设计可供选择的layouts(装备)和drawables(技能)

     

    你应该根据于你App的需求来创建可供选择的资源类型。通常,你应该使用大小和方向后缀来提供可选择的Layout资源,使用密度后缀来提供可选择的位图drawable资源

     

    可供选择的布局(layouts)

     

    你应该知道你的App是否有这个需求,是否需要根据不同的屏幕来提供可选择的布局。例如:

     

    • 当在一个small屏幕上测试时,你发现你的布局没有完全符合你的要求或者是没有匹配好屏幕。例如一排按钮没有很好的在small屏幕上显示。这种情况你应该为small屏幕提供一个可供选择的布局用来调整按钮的大小或者位置。
    • 当在一个extra large屏幕测试时, 如果没有有效利用大屏幕或者明显的被拉伸了,这种情况你也应该提供一种根据extra large屏幕的布局,并且最好再优化它以适应将来的平板设备

      虽然你的App没有提供大屏幕的布局运行起来也没问题,但UI被明显拉伸的感觉会让用户觉得这个APP不太精致,用户体验会大打折扣

    • 当在横屏和竖屏对比测试时, 你应该注意到UI元素在竖屏下是在底部,横屏下却是右边。如果你一直需要都在底部的话,你也应该配置后缀

    总的来说,你应该确保你的App布局如下:

    • 适用于小屏幕
    • 优化App使之在大屏幕上利用额外的空间
    • 优化横竖屏

    如果你的UI使用位图,那么你应该使用nine-patch (超牛B特殊技能,目前游戏版本没更新,以后更新了马上给学了)位图文件。nine-patch 这是android提供的一种格式并且它还提供一种根据让你吧美工出的图片稍微修饰。这种格式能允许你设置可以缩放的2D范围。当系统需要缩放时,系统会在你指定区域缩放 Nine-Patch位图。这样在不同的屏幕大小下你就不需要提供不同的位图资源了(可以节省APK的大小)。因为Nine-Patch会自动调整它的。但在不同的屏幕密度下你应该还是提供可供选择的Nine-Patch 文件。这样你的APP才会更健壮。关于nine-patch的使用我们以后会在第二大篇的图形章详细讲述。

     

    可供选择的drawables

     

    图3. 根据每一个密度下drawable下位图的相对大小(目前4种技能应该够用了)

     

    几乎每一个App都会根据不同的密度提供可选择的drawable资源,因为这对于用户体验和UI真的很重要。

    注意: 根据密度你仅需要提供drawable下的位图文件,如果你使用Xml来定义shape,colors或者其他drawable的资源,你就应该放到"drawable/"默认目录下

    根据不同的密度提供可选择的位图drawable资源时,你应该在四种密度下使用3:4:6:8的缩放比。你可以参考工程下每个不同的drawable里的icon尺寸。以下是数据:

    • 36x36 ldpi
    • 48x48 mdpi
    • 72x72 hdpi
    • 96x96 xhdpi

     

    关于Android 3.2平板上的布局

    第一代平板运行于android3.0上,一般是使用xlarge配置后缀(res/layout-xlarge/)来声明平板布局。为了提供其他类型的平板和屏幕大小----尤其是7寸平板!android3.2引入了一种新的方法来为更多离散的屏幕大小来指定资源。你的布局需要一种新的基于控件容量的技术(例如指定600dp的宽度),而不是试图使你的布局去适应那些android概括性的分组(例如large或xlarge)

    当android去概括大小分组时,对于7寸平板他们也很棘手,因为5寸手机和7寸平板使用同样的large组。这两个设备在size上表面上看起来更贴近彼此,但其实UI在相当大程度上还是不同的,用户体验的效果也不太好。因此一个7寸和5寸的屏幕将不使用同样的layout。根据这两种屏幕你应该尽可能的提供不同的布局,android现在允许我们指定基于宽度或高度layout资源,记住请使用dp单位。

    例如, 在你根据平板风格设计布局以后,你可能需要当屏幕小于600dp的宽度时候停止工作。这个界限会因为你的平板布局而变成最小的尺寸。这样你能立刻指定当至少宽度在600dp时候,layout中的资源文件才被用到。

    注意: 记住!dip是一个非常重要的单位,你的布局大小也应该用dp单位。因为它可以看做一种比例单位而非像素那样的绝对单位。

    使用新的大小后缀(非密度)

    你能为你的布局指定不同的资源配置。在下方的表格2中这些新的后缀提供给你更多的控制,相对于传统的(small, normal, large, and xlarge)这些已经超过它们了

    注意: 你指定使用的这些后缀并非实际的屏幕大小。当然,这些大小是根据宽度(dp单位)和高度(dp单位)被用于activitywindow中。window的特殊性在于它方法是有个动作条,用来显示电池和通知信息的。所以你在设计UI的时候需要考虑 你的App是否需要显示动作条。

    表格2. 以下是android3.2进入的新后缀(注意是基于屏幕大小的而不是密度)

     

    屏幕 配置 后缀值 描述
    最小宽度 sw<N>dp

    例如:
    sw600dp
    sw720dp

    用这个后缀可以确保不管当前屏幕是否横竖屏。你的App有一个至少<N>dp的可用宽度 

    例如, 如果你的layout一直需求最小屏幕的一边为600dp,那么你能使用这个后缀创建layout资源(res/layout-sw600dp/)。对于用户来讲,不管600dp是宽还是高,仅当屏幕可用的最小尺寸至少是600dp时,系统会使用这些资源(就是说你的设备不用以什么角度看,长和宽的某一边的最小值大于或等于600dp时,系统就会使用。)。当屏幕水平方向改变时,设备的最小宽度不会改变

    设备的最小宽度要考虑屏幕的装饰和系统UI。例如,如果设备有一些持续不变的沿着你最小宽度的轴方向的UI元素(动作条等),那么系统会宣布最小宽度比实际屏幕宽度要小,因为那些UI元素对于你的UI来说是不可用的

     因为宽度是经常影响布局的一个重要因素,所以使用最小宽度来控制一般的屏幕大小(针对平板)还是有用的。 可用宽度也是决定是否使用单屏幕布局(手机)和多屏幕布局(平板)关键因素,因此你很可能关心每一个设备上的最小方面。

    屏幕可用宽度 w<N>dp

    例如:
    w720dp
    w1024dp

    用dp单位指定一个最小化的在可用宽度下可以使用的资源。系统会根据宽度改变(横竖屏切换时)来匹配这个值,并反映到当前实际可用的宽度上

    当你决定是否使用多屏幕布局时它很有用,因为即使在平板设备上,你也经常不想要多屏幕布局会根据横竖屏来变化。因此你可以用这个来指定最小化的宽度需求,它可以用来代替方向后缀(land,port)和大小后缀(small,normal,large,xlarge)使之整合到一起。

    屏幕可用高度 h<N>dp

    例如:
    h720dp
    h1024dp
    etc.

    用dp单位指定一个最小化的屏幕高度。和"屏幕可用宽度"类似

     

    当使用这些后缀时你可能觉得比传统的那四种后缀复杂些,实际上你用过后就发现它很简单,它能一次简化你的UI需求。当你设计UI时,主要的事情就是需要考虑我们App中的实际大小,并且对于手机和平板风格的切换。它取决于你某些特定切换点的设计,可能对于平板布局你需要720dp的宽度,可能600dp就足够了,或者480,或者这两个之间。使用表格2的后缀,你可以在布局改变时精确的控制大小。以后我们会根据实际开发来讲述的

     

    配置例子

    以下是一些屏幕数据:

    • 320dp: 一种手机屏幕(240x320 ldpi, 320x480 mdpi, 480x800 hdpi, 等).
    • 480dp: 一种平板 (480x800 mdpi).
    • 600dp:  7寸平板(600x1024 mdpi).
    • 720dp: 10寸平板(720x1280 mdpi, 800x1280 mdpi, 等).

    我们使用表格2中的后缀来为我们的App定义不同的切换风格(包括手机和平板),例如, 如果我们的平板布局600dp是最小可用宽度,我们能提供两套布局方式:

    res/layout/main_activity.xml           # 手机
    res/layout-sw600dp/main_activity.xml   # 平板

    这种情况下,屏幕可用的最小宽度为600dp,这是伪了支持平板布局被应用。

    或者你可能想要区分7寸和10寸平板,你可以这么做:

    res/layout/main_activity.xml           # 手机(比600dp更小的可用宽度)
    res/layout-sw600dp/main_activity.xml   # 7寸平板 (600dp的宽度或者更大)
    res/layout-sw720dp/main_activity.xml   # 10寸平板(720dp的宽度或者更大)

    注意上面的两套例子的使用使用 sw(最小宽度)后缀,它指定屏幕的两边中的最小一边,不管屏幕的水平方向。它忽视横竖屏。

    然而某些情况下我们需要精确布局。例如如果你有一个 2个面板合并在一起的显示效果。是否屏幕提供至少600dp的宽度,是否横竖屏你都要使用它。就应该这:

    res/layout/main_activity.xml         # 手机(小于600dp的可用宽度)
    res/layout-w600dp/main_activity.xml  #多面板 (任意一个面板都是600dp或者更高的宽度)

    注意上面这里用的是w<n>dp。实际设备可能需要两套布局,它依赖于屏幕的水平方向(一边至少是600dp的宽度,另一边小于600dp,你会发现不管横竖屏都满足这个条件。所以你需要准备两套关于横竖屏的布局)

    关于什么是多屏手机或者叫多面板手机。我发个图给大家看看就明白了(下面这个手机其实有3屏)

     

    关于声明屏幕支持的大小

     

    在android3.2的manifest 中引入了<supports-screens> 节点,以后再讲manifest 文件的时候我们会详细描述

    实践中应该注意哪些

    在多样的屏幕中我们使用传统的四种配置还是能很好的获得支持的。上面我们提供了多种定义的方法。添加这些后缀能确保你的App能适应不同的屏幕设备。

    下面是一些方法,告诉你如何确保你的应用程序可以正确地显示在不同的屏幕上:

    1. 在XML布局文件中请使用wrap_content, fill_parent, 或者 dp 单位
    2. 在你的程序代码中最好不要使用像素(px)这种硬编码
    3. 不要使用AbsoluteLayout (绝对布局)
    4. 提供不同的位图drawable资源来适应不同的屏幕密度.

    1. 使用在XML布局文件中请使用wrap_content, fill_parent, 或者 dp 单位(装备附魔要搞好)

    当在XML中为你的Views定义android:layout_widthandroid:layout_height 时, 使用"wrap_content", "fill_parent" 或者dp 单位来保证View在当前屏幕上获得一个合适的大小。

    例如,一个view的宽为layout_width="100dp"   在mdpi的屏幕下它是100px,在hdpi的屏幕下它就是150px,但显示出来的效果在物理屏幕上是一样的大小

    同样, 对于定义文本的大小,我们应该用sp(scale-independent pixel)。 因为sp和dp的概念是一样的,它们不是绝对的像素值

    2.在你的程序代码中最好不要使用像素(px)这种硬编码

    由于执行原因并使代码更简单,android系统使用像素作为标准单位用来描述尺寸或坐标值。就是说在代码中android还是使用的像素用来表述尺寸,但它是基于当前屏幕密度的,所以是变化的。如果代码中 View.getWidth()返回的值是10,这么这个10的单位为像素,但这仅仅是在某一个密度的屏幕上而已,其他不同密度的屏幕上它的结果就会不一样了。所以android是不建议我们在代码中用像素来设置布局的,因为它会加重我们的工作量,并且处理的也不一定很好。想象一下这么多屏幕设备你如果用代码来适配的话,你就得考虑的非常严谨了。不过如果你只针对某一种屏幕的话就另当别论了,但这种情况很少见。

    3.不要使用AbsoluteLayout (绝对布局)(这种装备out了,赶紧摧毁)

    请不要使用AbsoluteLayout(绝对布局)这种布局是早期android的版本,在android1.5版本的时候就已经废弃了。虽然为了兼容以前很老的设备这种布局还存在,但目前来说,我们已经完全没有必要再使用它了。 

    4.提供不同的位图drawable资源来适应不同的屏幕密度.(根据不同的boss我们应该选相应的技能哦)

    虽然在当前屏幕配置上系统会自动缩放你的layout和drawable资源,但为了优化某些特定密度的设备,可能我们并不想让它缩放,我们想给这种密度指定一套资源也是可以而且这样的效果也

    很不错,能更好的根据不同的屏幕来调整我们的UI。这个我们在本文中已经反复提到了,目的就是为了加深你的印象。

    一个很好的例子就是关于你用eclipse生成android工程的时候,三种不同的drawable(res/drawable-ldpi/icon.png,res/drawable-mdpi/icon.png,res/drawable-hdpi/icon.png)中都

    会自动生成不同尺寸的icon.png。

    注意: 如果我们没有定义某个后缀,但屏幕密度又是需要那个后缀的话,那么系统会假定你的资源都是基于mdpi(默认)的。并会放缩你的资源

     

    关于密度额外的注意事项

     

    这一段主要描述android在不同屏幕密度上是怎么缩放位图drawable的,我们需要更进一步的掌握系统控制位图资源的原理。

     

    当在运行时操作图形,我们能更好的理解它是怎样支持多屏幕的,我们应该了解下系统是如何保证适应屏幕并适当的缩放位图的:

     

    1. 载入时自动缩放 (比如位图drawables)--根据boss密度自动选择技能?这真太智能了

      基于当前屏幕的密度,系统使用任意大小或者密度的资源来显示它们的时候是没有缩放过的。如果在当前密度下没有可用的资源,那么系统会载入默认资源并等比缩放它们来匹配当前屏幕的密度。除非有有针对密度的后缀出现,不然系统都是认为默认资源(没有后缀的drawable)是为mdpi的密度来设计的。因此系统这个时候会调整位图的大小来适应屏幕。

      如果你需求资源缩放之前的大小,那系统实际上返回的是缩放后的大小。例如:如果你没有指定hdpi后缀,一个在mdpi下50px*50px的位图在一个hdpi下会缩放为75px*75px。在hdpi屏幕下系统会返回这个75px这个大小。

      如果你不希望系统根据不同的密度来缩放资源,那么请记住使用“res/drawable-nodpi/”

    2. 运行时自动缩放(比如像素的大小和坐标)--打boss的时候在自动选?这也挺牛B

      一个App能关闭载入时自动缩放的这个功能,只要你在manifest中设置android:anyDensity ="false",或者在程序中使用BitmapFactory.Options.inScaled返回的值为false。在这种情况下。系统会在绘制的时候自动等比缩放任何绝对坐标和像素大小。这么做确保用针对像素的屏幕元素能一直显示。系统会处理缩放,然后转化并报告缩放的像素大小,而不是物理像素大小。下面我们来举个例子:

      例如,假设一个设备有一个WVGA(800*480)下是hdpi的屏幕,并且它和在传统的HVGA(480*320)屏幕一样的物理大小,但执行App的时候关闭了载入时自动缩放这个功能。这样的话,当系统查询屏幕大小时,它会认为谁TMD的这么坑爹。然后他会报告一个320*533的大小,为什么会是320*533呢,我们开的模拟器是800*480的啊!!因为系统在绘制的时候缩放了。系统报告的是缩放后的像素大小,而不是我们模拟器上的物理大小。然后App需要绘制操作时,本来想在(10,10)上的位置绘制,但会变成(15,15)。如果你的App直接操作缩放位图,那这种差异可能导致意外的行为。以前很多刚开始接触android的朋友经常会遇到系统报告320*533的这种问题。原因就是由于我们关闭了载入时自动缩放这个功能。你关闭了它的话,它就会在运行时缩放并返回结果。所以我们要检查manifest中是否设置android:anyDensity ="false"。如果有赶快去掉。也许还有朋友发现没有设置怎么也会出现这种问题,这是由于以前比较老的SDK版本系统默认设置关闭了载入时自动缩放这个功能导致的,不过目前这种情况很少发生了。

     

    运行时创建缩放的位图对象

    我们的App如果需要在内存中创建一个位图(bitmap)对象,那么系统会认为你是基于mdpi密度的屏幕来创建的。默认的,系统会根据屏幕密度在绘制的时候自动缩放这个位图。当位图没有指

    定密度属性时候,系统会自动缩放。为了控制位图在运行时创建后是否被缩放,我们可以指定位图的密度属性,使用Bitmap.setDensity()。具体的值可以传DisplayMetrics.DENSITY_HIGH或

    其他。我们还可以从文件或者一个流中使用BitmapFactory来创建位图,使用BitmapFactory.Options来定义位图的属性,那么系统会根据你的属性来缩放它。我们还可以使用

    BitmapFactory.Options.inDensity来指定这个位图是否需要匹配当前的屏幕密度。如果我们设置BitmapFactory.Options.inDensity=false;那么系统在载入位图时将不会自动缩放它,只会在

    运行时缩放它。使用运行时缩放CPU占用率高,内存占用低。使用载入时缩放CPU占用率低,内存占用高。如何取舍就看你的需求了。

     

    dp 和 像素的转换(攻击力有时候还需要转成技能的)

     

    有些情况下,dp和px只需要相互转换的。例如一个App在用手指滑动屏幕的时候会感应用户的手指移动了多少个像素。在一个normal和mdpi的屏幕下,用户必须移动16px/160dpi,等价于十分之一英寸(大约2.5mm(毫米))。那么在一个hdpi(240dpi)的屏幕上用户必须移动16px/20dpi,等价十五分之一英寸(1.7mm)。距离是很短的,因此这对用来说会很敏感。为了修复这个问题,需要用代码吧dp转换成px单位。例如:

     

    // 手势的响应的范围(dp)
    privatestaticfinalfloat GESTURE_THRESHOLD_DP =16.0f// 获取屏幕的密度来缩放
    finalfloat scale =getResources().getDisplayMetrics().density;
    //根据密度吧dp转换成px
    mGestureThreshold =(int)(GESTURE_THRESHOLD_DP * scale +0.5f);
    // 可以使用这个响应的范围了

     

    这里DisplayMetrics.density的值为(0.75[ldpi],1[mdpi],1.5[hdpi],2[xhdpi]) ,其实我们还可以使用ViewConfiguration类来处理,但前提是打开了载入时缩放这个功能(目前来说,默认都

    是开的不用担心)并且我们可以使用ViewConfiguration. getScaledTouchSlop()来直接获得换算距离。具体使用如下:

    privatestaticfinalint GESTURE_THRESHOLD_DP =ViewConfiguration.get(myContext).getScaledTouchSlop();
    
    

    在多种屏幕下怎样测试我们的App

    图5. 这是android SDK中的AVD工具,它提供一套虚拟机设备。上面这些都是通过你点击"new"建立的,不是默认就有的哦,以后会详细讲述使用方法的

    在发布我们的应用之前,我应该在不同的屏幕大小和密度上测试我们的App。android SDK中有很多模拟器,我们可以修改模拟器上的默认的大小,密度,分辨率来整合测试。例如使用android2.1版本的模拟器,我们可以同时新建多个2.1的版本,但每个的密度不同。这么多模拟器可以为我们省下很多钱来买不同的手机。如果你想修改某个模拟器的密度,你只需要选中它点击右边的edit就可以修改了。如下图所示:

    为了测试App是否支持多种不同的屏幕,我们应该创建一系列的AVD(android virtual devices)。如果不用eclipse的话,我们可以在sdk目录下执行SDK Manager.exe这样就显示出图5的界面

    关于android虚拟机的管理和使用我们以后会详细描述。

     

    表格3. 以下是模拟器中多种可用的配置(加粗的是模拟器中自带的,如果需要其他就需要手动设置下了)

      Low density (120), ldpi Medium density (160), mdpi High density (240), hdpi Extra high density (320), xhdpi
    Small screen QVGA (240x320)   480x640  
    Normal screen WQVGA400 (240x400)
    WQVGA432 (240x432)
    HVGA (320x480) WVGA800 (480x800)
    WVGA854 (480x854)

    600x1024
    640x960
    Large screen WVGA800(480x800)
    WVGA854 (480x854)
    WVGA800(480x800)
    WVGA854 (480x854)

    600x1024
       
    Extra Large screen 1024x600 WXGA (1280x800)
    1024x768
    1280x768
    1536x1152
    1920x1152 
    1920x1200
    2048x1536
    2560x1536 
    2560x1600

    † 表示用于android3.0的平台

     

    图6. 这是设置我们模拟器开启后的大小,一般默认的模拟在电脑上打开显然很大,如果你需要缩小的话就条市政以下scale即可

    建议大家启动模拟器的时候最好不要缩放,这样看起来的结果是物理屏幕上区别就不会很大了。当你从AVD Manager启动一个模拟器时,我们指定的dpi的时候,可以和自己显示器匹配下。

    如果我们需要使用命令启动的话,可以这样启动:

    emulator -avd <avd_name>-scale 96dpi
    展开全文
  • 关于APIC的一些概念

    千次阅读 2013-08-12 14:15:43
    关于APIC的一些概念,很早以前某个大神通过studyOS机制,研究出来的APIC的工作模式,特摘录部分概念。 事实上,老久的PIC在很早以前就被淘汰了,取而代之的是APIC。由于APIC可以兼容PIC,所以在很多单处理器...

    关于APIC的一些概念,很早以前某个大神通过studyOS机制,研究出来的APIC的工作模式,特摘录部分概念。


    事实上,老久的PIC在很早以前就被淘汰了,取而代之的是APIC。由于APIC可以兼容PIC,所以在很多单处理器系统上我们看到的PIC实际是APIC的兼容PIC模式。APIC主要应用于多处理器操作系统,是为了解决IRQ太少和处理器间中断而产生的,当然,单处理器操作系统也可以使用APIC(不是模拟PIC)。APIC的HAL和PIC的HAL有很大的不同,很突出的一个特点就是APIC的HAL不用再象PIC的HAL那样虚拟一个中断控制器,IRQL的概念已经可以通过中断向量的形式被APIC支持。事实上,因为被APIC所支持,所以在APIC HAL里IRQL的实现比PIC HAL那样虚拟一个中断控制器要简单得多了。


        现在来简单介绍一下APIC的结构(关于APIC详细的描述请参考《IA-32 Inel Architecture Software Developer's Manual Volume 3 Chapter 8》)。整个APIC系统由本地APIC、IO APIC和APIC串行总线组成(在Pentium 4和Xeon以后,APIC总线放到了系统总线中)组成。每个处理器中集成了一个本地APIC,而IO APIC是系统芯片组中一部分,APIC总线负责连接IO APIC和各个本地APIC。本地APIC接收该处理器产生的本地中断比如时钟中断,以及由该处理器产生的处理器间中断,并从APIC串行总线接收来自IO APIC的消息;IO APIC负责接收所有外部的硬件中断,并翻译成消息选择发给接收中断的处理器,以及从本地APIC接收处理器间中断消息。

        和PIC一样,控制本地APIC和IO APIC的方法是通过读写该单元中的相关寄存器。不过和PIC不一样的是,Intel把本地APIC和IO APIC的寄存器都映射到了物理地址空间,本地APIC默认映射到物理地址0xffe00000,IO APIC默认映射到物理地址0xfec00000。windows HAL再进一步把本地APIC映射到虚拟地址0xfffe0000,把IO APIC映射到虚拟地址0xffd06000,也就是说对该地址的读写实际就是对寄存器的读写,本地APIC里几个重要的寄存有EOI寄存器,任务优先级寄存器(TPR),处理器优先级寄存器(PPR),中断命令寄存器(ICR,64位),中断请求寄存器(IRR,256位,对应每个向量一位),中断在服务寄存器(ISR,256位)等。IO APIC里几个重要的寄存器有版本寄存器,I/O寄存器选择寄存器、I/O窗口寄存器(用要访问的I/O APIC寄存器的索引设置地址I/O寄存器选择寄存器,此时访问I/O窗口寄存器就是访问被选定的寄存器)还有很重要的是一个IO重定向表,每一个表项是一个64位寄存器,包括向量和目标模式、传输模式等相关位,每一个表项连接一条IRQ线,表项的数目随处理器的版本而不一样,在Pentium 4上为24个表项。表项的数目保存在IO APIC版本寄存器的[16:23]位。APIC系统支持255个中断向量,但Intel保留了0-15向量,可用的向量是16-255。并引进一个概念叫做任务优先级=中断向量/16,因为保留了16个向量,所以可用的优先级是2-15。当用一个指定的优先级设置本地APIC中的任务优先级寄存器TPR后,所有优先级低于TPR中优先级的中断都被屏蔽,是不是很象IRQL的机制?事实上,APIC HAL里的IRQL机制也就是靠着这个任务优先级寄存器得以实现。同一个任务优先级包括了16个中断向量,可以进一步细粒度地区分中断的优先级。
    展开全文
  • 关于数据库的一些基本概念

    千次阅读 2020-02-29 19:35:51
    数据库的基本概念 一 数据 数据的定义:在计算机科学中,数据的定义是指所有能输入到计算机并被计算机程序处理的符号的介质的总称,是用于输入电子计算机进行处理,具有一定意义的数字、字母、符号和模拟量等的通称...
  • 关于数据库的基本概念性问题

    千次阅读 2011-05-13 16:22:00
    关于数据库的基本概念性问题
  • 【ML】支持向量机(SVM)从入门到放弃再到掌握

    万次阅读 多人点赞 2018-08-23 16:46:26
    朋友,你通过各种不同的途经初次接触支持向量机(SVM)的时候,是不是会觉得这个东西耳熟能详,感觉大家都会,却唯独自己很难理解? 每一次你的老板或者同仁让你讲解SVM的时候,你觉得你看过这么多资料,使用过...
  • 自动化(Automation)基础概念:接口描述语言(IDL)与类型库(TypeLib)许式伟 (版权声明)2007-4-26在前文,我们已经解释了: 自动化(Automation)基础概念:COM组件(Component)与接口(Interface) 自动化...
  • Verilog对电路功能的描述有三种方式:结构化描述、数据流描述、行为级描述。三种描述方式抽象级别不同,各有优缺点,相辅相成,需要配合使用。 目录 一、结构化描述 1、概念 2、特点 3、示例 真值表: 电路...
  • 不过Qt中所涉及的Qt/E、Qtopia、qvfb、framebuffer、qpe等众多概念,却有点剪不断理还乱。于是决定花点时间对这些概念好好捋一捋。说明一下,下面的文字内容大部分确实源自于网络摘录,但是都是经过我自己本人消化...
  • 关于软件工程的一些基本概念

    万次阅读 2012-03-30 13:58:35
    一直对软件工程中的很多概念都混淆不清,因此查找了相关资料,对很多概念进行了总结,现在脑子终于清楚了! 1.软件生命周期(SDLC,Software Devlopment Life Cycle)  软件从孕育、诞生、成长、成熟、衰亡等等段...
  • 官网原文标题《Concepts and Architecture--Messaging Concepts》 翻译时间:2018-10-04 ... 译者:本文介绍了Pulsar消息系统中的核心概念,是入门学习pulsar的开篇...他的核心概念和其他消息系统类似,尤其是kafka,...
  • 作为专栏文章的第二篇,本文从数据组织、数据分布、集群角色、数据写入与存储结构多个方面对Elasticsearch的核心概念进行整理,尽可能由浅入深的交代清楚每个概念
  • 关于数字IC后端设计的一些基础概念与常识

    万次阅读 多人点赞 2017-08-19 16:13:32
    近一周忙里偷闲,利用晚上的琐碎时间跑了一个录音芯片的后端PD流程,由于之前在课堂上学的数字EDA仅限于书本概念,一些概念的理解只是停留在表面,实践之后的确豁然开朗了很多,里面很多技术细节绝不是课堂上翻几页...
  • 支持向量机SVM、支持向量回归SVR详细推导

    万次阅读 多人点赞 2019-06-30 09:31:52
    文章详细介绍了支持向量机SVM及其拓展,支持向量回归SVR.并从线性分类和非线性分类的角度出发,详细推导了硬间隔、软间隔和核函数的支持向量机。
  • 一、关于数据库理论中概念模型、逻辑模型、物理模型之间的区别。 二、数据库建模是对现实世界进行分析、抽象、并从中找出内在联系,进而确定数据库的结构。 1、概念模型:就是从现实世界到信息世界的第一层抽象,...
  • 概念模型

    千次阅读 2013-07-16 11:12:27
    也就是说,首先把现实世界中的客观对象抽象为某一种信息结构,这种信息结构并不依赖于具体的计算机系统,不是某一个数据库管理系统(DBMS)支持的数据模型,而是概念级的模型,称为概念模型。 简介  让读者...
  • SQL Server基础知识概念要点详细讲解

    万次阅读 多人点赞 2018-03-30 14:41:57
    SQL Server基础知识概念要点详细讲解 ...模式:在数据库三级模式结构中,对数据库中全部的数据逻辑结构、特征进行描述。 内模式:最接近于物理存储设备一级的结构,是对数据库物理存储方式的...
  • 面向对象基本概念

    万次阅读 多人点赞 2019-02-06 21:56:15
    面向对象就是:把数据及对数据的操作方法放在一起,作为一个相互依存的整体...对象即为人对各种具体物体抽象后的一个概念,人们每天都要接触各种各样的对象,如手机就是一个对象。 面向对象编程(OOP:object-orie...
  • J2EE的概念以及容器概念总结

    千次阅读 2017-06-13 00:13:17
    J2EE的概念以及容器概念总结
  • 支持向量机通俗导论(理解SVM的三层境界)

    万次阅读 多人点赞 2012-06-01 22:48:43
    支持向量机通俗导论(理解SVM的三层境界) 作者:July 。致谢:pluskid、白石、JerryLead。 说明:本文最初写于2012年6月,而后不断反反复复修改&amp;优化,修改次数达上百次,最后修改于2016年11月。 声明:...
  • WebRTC -- 流媒体基础概念

    万次阅读 2017-12-24 22:17:26
    会话描述协议(Session Description Protocol或简写SDP)描述的是流媒体的初始化参数。此协议由IETF发表为 RFC 2327。 SDP完全是一种会话描述格式,它不属于传输协议。 SDP用于描述多媒体通信会话,包括会话建立...
  • NFV基本概念

    万次阅读 多人点赞 2019-07-29 11:26:27
    1.NFV相关基本概念 NFV(网络功能虚拟化) SDN(软件定义网络) 一个NFV的标准架构包括NFV infrastructure(NFVI),MANO(Management and Orchestration)和VNFs,三者是标准架构中顶级的概念实体。 NFVI(NFV ...
  • 关于MySQL,Oracle和SQLServer的概念,特点,以及区别

    千次阅读 多人点赞 2018-10-29 14:46:27
    1.1 mysql概念 mysql是一个关系型数据库管理系统,使用结构化查询(sql)进行数据库管理,sql是最常用的数据库管理语言。 关系型数据库:是指采用了关系模型来组织数据的数据库。简单来说,关系模型指的就是二维表格...
  • RabbitMQ基础概念详解

    万次阅读 2017-03-01 18:51:48
    RabbitMQ常用的Exchange Type有fanout、direct、topic、headers这四种(AMQP规范里还提到两种Exchange Type,分别为system与自定义,这里不予以描述),下面分别进行介绍。 fanout fanout类型的Exchange路由规则...
  • Hive基本概念

    千次阅读 2019-11-20 10:47:52
    描述数据的数据就是元数据表的名字,表的列 列的类型 Hive内部执行过程 解释器 -> 编译器(会使用到元数据) -> 优化器 -> 执行器 Hive基本介绍 Hive中没有定义专门的数据格式,用户提供的数据是什么格式,...
  • OpenMP基本概念

    万次阅读 2018-09-14 16:24:31
    OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的并行程序设计。编译器根据程序中添加的pragma指令,自动将程序并行处理,使用OpenMP降低了并行编程的难度和复杂度。当编译器不支持OpenMP时,程序...
  • WSDL[Web 服务描述语言]

    千次阅读 2012-05-22 14:43:55
    SDL就是对Web服务软件的描述。具体来说,它描述所有公共可用的方法、交换方法、消息类型以及用在网络层的传输协议和Web服务的地址。...WSDL和Java类似,因为它支持抽象和具体概念、以及接口。类似于Java,WSDL
  • Oracle 备份恢复概念

    万次阅读 2010-08-05 20:35:00
    --======================-- Oracle 备份恢复概念--====================== 数据库维护中,备份或恢复是重中之重的问题。尽管很多时候数据库系统运行缓慢,但对数据库数据的丢失而言,显然后者损失的代价是不言而喻...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 473,116
精华内容 189,246
关键字:

关于支持概念的描述