Android Drawable

Drawableは、開発でよく使用される概念です。Viewの背景を設定するためによく使用されます。背景には、カラー値、リソースイメージ、またはカスタムDrawable(形状、セレクター、レイヤー-リストなど)など。この記事では、DrawableとViewの関係について簡単に説明し、コードと組み合わせて、DrawableがViewでどのように機能するかを簡単に分析します。

ドローアブル紹介

公式紹介:

Drawableは、「描画できるもの」の一般的な抽象概念です。ほとんどの場合、画面に物を描画するために取得されるリソースのタイプとしてDrawableを扱います。Drawableクラスは、さまざまな形式をとる可能性のある基盤となるビジュアルリソースを処理するための汎用APIを提供します。ビューとは異なり、Drawableには、イベントを受信したり、ユーザーと対話したりする機能はありません。

翻訳:

Drawableは、「すべてのDrawable」を抽象化したものです。ほとんどの場合、さまざまなタイプのリソースをDrawableに変換するだけで、Viewを使用して画面にレンダリングできます。Drawableクラスは、さまざまなビジュアルリソースを解析してCanvasに変換するための一般的なAPIを提供します。Viewとは異なり、Drawableはイベントやユーザーの操作を受け入れることができません。

全体として、Drawableは描画可能なものを抽象化したものです。Viewと比較して、より純粋です。描画関連の処理に使用されます。ユーザーの操作イベントを処理できず、処理する必要がありません。操作関連の操作はすべてViewによって実行されます。完了しましたが、背景に関連するほとんどのことはDrawableを介して実行できます。

ドローアブルにはさまざまな形式があります。

Bitmap:最简单的Drawable,一个PNG或JPEG图像。

Nine Patch:是对PNG格式的扩展允许它指定如何对其进行拉伸和放置的信息

Vector:向量:在XML文件中定义的可绘制的一组点,线和曲线以及相关的颜色信息。 这种类型的绘图可以缩放而不会损失显示质量。

Shape:形状:包含简单的绘图命令而不是原始位图,允许在某些情况下调整更好。

Layers:图层:一个可绘制的复合物,它在彼此顶部绘制多个底层可绘图。

States:状态,一个复合drawable,根据其状态选择一组drawable中的一个。

Levels:级别:一个复合drawable,根据其级别从一组drawable中选择一个。

Scale:比例尺:一个可绘制的单个子组合可绘制的组合,其整体大小根据当前级别进行修改。

公式紹介:
公式紹介

DrawableがViewでどのように機能するか

通常、ビューの背景は次の方法で設定する必要があります。

  1. ビューの背景を色で設定します。
    例:button.setBackgroundColor(Color.YELLOW);
    主に次のapi:
    setBackgroundColor(@ColorInt int color)
  2. 画像リソースファイルまたはカスタムxmlファイルを使用して、ビューの背景を設定します。
    例:button.setBackgroundResource(R.drawable.shape_normal);
    メインAPIは次のとおりです
    。setBackgroundResource(@DrawableRes int resid)
    setBackground(Drawable background)

私たちは通常の開発でこれを書くことがよくありますが、設定された背景のDrawableはビューにどのように影響しますか?おそらく多くの人がこの問題について考えていません。簡単な分析を次に示します。

Drawableは抽象クラスです。ここでは、DrawableがViewに対してどのように動作するかを、いくつかの抽象メソッドを通じて分析します。Drawableのいくつかの抽象メソッドを次に示します。

public abstract void draw(@NonNull Canvas canvas);
public abstract void setAlpha(@IntRange(from=0,to=255) int alpha);
public abstract void setColorFilter(@Nullable ColorFilter colorFilter);

drawメソッドがあり、canvasオブジェクトがパラメーターで提供されていることがわかります。

ビューがsetBackgroundメソッドを使用してドローアブルオブジェクトを設定し、ドローアブルにドローメソッドがある場合、ビューが独自の背景を描画するときに、ドローアブルオブジェクトのドローメソッドを直接呼び出します。このドローメソッドには、直接使用できるキャンバスオブジェクトが必要です。ビューのCanvasオブジェクトが渡されると、Drawableは独自の描画コンテンツをビューに正常に適用できます。

このプロセスは、Viewが独自の背景描画機能をDrawableオブジェクトにアウトソーシングするのと同じです。

さらに、これも非常に優れたデザインパターンです。ビューは、独自のサイズの測定、位置の指定、およびビューの前景の描画を担当しますが、独自の背景描画をより独立したドローアブルに割り当てて、それ自体を作成します。より軽量になり、Viewは背景描画の責任を描画可能なオブジェクトに正常に割り当てました。

ソースコードを確認してください。ビューにはプライベートメソッドdrawBackgroundがあり、その役割はキャンバスにドローアブルを描画することです。

    /**
     * Draws the background onto the specified canvas.
     *
     * @param canvas Canvas on which to draw the background
     */
    private void drawBackground(Canvas canvas) {
    
    
        final Drawable background = mBackground;
        if (background == null) {
    
    
            return;
        }

        setBackgroundBounds();

        // Attempt to use a display list if requested.
        if (canvas.isHardwareAccelerated() && mAttachInfo != null
                && mAttachInfo.mThreadedRenderer != null) {
    
    
            mBackgroundRenderNode = getDrawableRenderNode(background, mBackgroundRenderNode);

            final RenderNode renderNode = mBackgroundRenderNode;
            if (renderNode != null && renderNode.isValid()) {
    
    
                setBackgroundRenderNodeProperties(renderNode);
                ((DisplayListCanvas) canvas).drawRenderNode(renderNode);
                return;
            }
        }

        final int scrollX = mScrollX;
        final int scrollY = mScrollY;
        if ((scrollX | scrollY) == 0) {
    
    
            background.draw(canvas);
        } else {
    
    
            canvas.translate(scrollX, scrollY);
            background.draw(canvas);
            canvas.translate(-scrollX, -scrollY);
        }
    }

参照:
Android DrawableAndroid
のさまざまなDrawableクラスの簡単な分析AndroidでのDrawableの全体的な紹介の詳細な説明

おすすめ

転載: blog.csdn.net/yzpbright/article/details/109250538