Android UI 绘制过程浅析(四)draw过程

前言

  draw是绘制View三个步骤中的最后一步。同measure、layout同样,一般不对draw自己进行重写,draw内部会调用onDraw方法,子类View须要重写onDraw(Canvas),以完成最终的绘制。java

  若是必定要重写draw(Canvas)的话,须要在方法的开始处调用super.draw(canvas)。android

draw过程

  draw内部具体作了什么事情,在View.java的源码注释中已经作了很是详细的介绍canvas

        /*
         * Draw traversal performs several drawing steps which must be executed
         * in the appropriate order:
         *
         *      1. Draw the background
         *      2. If necessary, save the canvas' layers to prepare for fading
         *      3. Draw view's content
         *      4. Draw children
         *      5. If necessary, draw the fading edges and restore layers
         *      6. Draw decorations (scrollbars for instance)
         */
  1. 绘制背景
  2. 若须要的话,保留画布的图层,以便实现fading效果时使用
  3. 绘制内容,这一步调用了onDraw方法
  4. 绘制子View,对于ViewGroup须要实现该方法
  5. 若须要的话,绘制fading的边缘而且恢复图层
  6. 绘制附件(譬如滚动条)

一个简单的自定义View

  draw这个过程,在目前的阶段能讲的东西并很少。若是深刻到具体一个SDK已经实现的View内部去看代码,够我吃一大壶的了——单单是最经常使用的TextView,它的onDraw就很是复杂。app

  这里本身实现一个很是简单的Custom View——在一块背景色上显示一行文字。先来看一下完成后的页面截图:ide

   是否是很是简单?下面是自定义的ThreeBodyView.javaspa

public class ThreeBodyiView extends View {
    private Paint mPaint;
    private String mText;

    public ThreeBodyiView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mText = "nothing to show...";
    }

    @Override
    protected void onDraw(Canvas canvas) {
        mPaint.setColor(Color.GREEN); // 背景色
        canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
        mPaint.setColor(Color.RED);
        mPaint.setTextSize(100); // 文字颜色、大小
        canvas.drawText(mText, 0, getHeight() / 2, mPaint);
    }

    public void setText (String s) {
        mText = s;
        super.invalidate();
    }
}

 

   ThreeBodyView.java在一块矩形区域里显示了一行文字,能够经过setText(String)方法来动态改变所显示的文字。3d

  在使用的时候,是这样用的:rest

fake_main_activity.xmlcode

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fake_main_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <com.leili.imhere.view.ThreeBodyiView
        android:id="@+id/three_body_view"
        android:layout_width="300dp"
        android:layout_height="300dp" />

</FrameLayout>

 

 FakeMainActivity.javaorm

public class FakeMainActivity extends Activity {
    private ThreeBodyiView tbView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        super.setContentView(R.layout.fake_main_activity);
        tbView = (ThreeBodyiView) super.findViewById(R.id.three_body_view);
        tbView.setText("世界属于三体!");
    }
}

 

 小结

  分析了draw的过程,在讲解onDraw时,佐以一个简单的demo,demo中实现一个弱化的TextView。

  下一篇是本系列的完结篇,会作一个较完整的自定义View/ViewGroup。

相关文章
相关标签/搜索