Android UI 绘制过程浅析(五)自定义View

前言

  这已经是Android UI 绘制过程浅析系列文章的第五篇了,不出意外的话也是最后一篇。再次声明一下,这一系列文章,是我在拜读了csdn大牛郭霖的博客文章《带你一步步深入了解View》后进行的实践。

  前面依次了解了inflate的过程,以及绘制View的三个步骤:measure, layout, draw。这一次来亲身实践一下,通过自定义View来加深对这几个过程的理解。

自定义View的分类

  根据实现方式,自定义View可以分为以下3种类型。

  • 自绘控件。View的绘制代码(onDraw)由开发者自己完成。
  • 组合控件。类似Java中的组合,将SDK提供的多个View合成为一个。
  • 继承控件。类似Java中的继承,为SDK的某个控件增添新的功能。

自绘控件

  自绘控件需要我们实现onDraw的绘制方法。这里做了一个小demo,RockPaperScissorView。当用户点击View时,随机出现石头/布/剪刀中的一种手势。为了简化,没有采用图片展示,而是用的文字。

RockPaperScissorView.java

public class RockPaperScissorView extends View implements View.OnClickListener {
    private Paint mPaint;
    private static final String[] GESTURES = {"Rock", "Paper", "Scissor"};
    private Random rand = new Random(System.currentTimeMillis());
    private String mText;
    private Rect mBounds;

    public RockPaperScissorView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mBounds = new Rect();
        mText = "click me plz...";
        super.setOnClickListener(this);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        mPaint.setColor(Color.GREEN); // 背景色
        canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
        mPaint.setColor(Color.RED);
        mPaint.setTextSize(100); // 文字颜色、大小
        mPaint.getTextBounds(mText, 0, mText.length(), mBounds);
        float textWidth = mBounds.width();
        float textHeight = mBounds.height();
        canvas.drawText(mText, getWidth() / 2 - textWidth / 2, getHeight() / 2 + textHeight / 2, mPaint);
    }

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

    @Override
    public void onClick(View v) {
        setText(GESTURES[rand.nextInt(GESTURES.length)]);
    }

  自定义View需要实现onClickListener接口,不要忘了在构造函数中setOnClickListener(this)。在Canvas.drawText中,参数决定的开始绘制的点是文本的左下角,故通过 canvas.drawText(mText, getWidth()/2 - textWidth/2, getHeight()/2 + textHeight/2, mPaint) 来控制居中。截图如下:(动图技能尚未get)

组合控件

  SDK提供了Button、TextView、ImageView等等一系列基础的控件,当我们需要一个比较复杂且通用的控件时,可以将这些基础控件组装起来,构成自己的组合控件。

  下面实现一个简单的小demo,实现了通讯录联系人的一行样式,包含头像(ImageView)、姓名(TextView)、电话号码(TextView)。首先是布局文件。

simple_contact.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/sky_blue"
    android:padding="10dp">

    <ImageView
        android:id="@+id/avatar"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:src="@drawable/liangjingru" />

    <TextView
        android:id="@+id/name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@id/avatar"
        android:layout_marginLeft="6dp"
        android:layout_toRightOf="@id/avatar"
        android:text="梁静茹"
        android:textColor="@color/black"
        android:textSize="@dimen/text_size_34" />

    <TextView
        android:id="@+id/phone"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@id/name"
        android:layout_below="@id/name"
        android:layout_marginTop="10dp"
        android:text="093132520"
        android:textColor="@color/black"
        android:textSize="@dimen/text_size_24" />

</RelativeLayout>

  布局文件画出来是这个样子的:

时间: 2024-10-25 03:46:02

Android UI 绘制过程浅析(五)自定义View的相关文章

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

前言 draw是绘制View三个步骤中的最后一步.同measure.layout一样,通常不对draw本身进行重写,draw内部会调用onDraw方法,子类View需要重写onDraw(Canvas),以完成最终的绘制. 如果一定要重写draw(Canvas)的话,需要在方法的开始处调用super.draw(canvas). draw过程 draw内部具体做了什么事情,在View.java的源码注释中已经做了非常详细的介绍 /* * Draw traversal performs several

Android UI 绘制过程浅析(三)layout过程

前言 上一篇blog中,了解到measure过程对View进行了测量,得到measuredWidth/measuredHeight.对于ViewGroup,则计算出全部children的宽高进行求和.本篇来分析一下layout过程. layout综述 layout方法对一个View及它的后代分配size与position,是View绘制过程的第二步(the second phase of layout mechanism),其中用到了上一步measure出的宽高.与measure-onMeasu

Enhancing Android UI with Custom Views 通过自定义view来让你的UI更屌!

Enhancing Android UI with Custom Views (通过自定义view来让你的UI更屌) Table of Contents: Custom View View Measurement View Drawing Custom Attributes Custom ViewGroup ViewGroup Measurement Layout ViewGroup Drawing More Custom Attributes There are many great adva

Android UI设计之&lt;十二&gt;自定义View,实现绚丽的字体大小控制控件FontSliderBar

转载请注明出处:http://blog.csdn.net/llew2011/article/details/51668407 了解iOS的同学应该知道在iOS中有个UISliderBar控件,在iPhone手机中的设置文字大小中使用了该控件.近来产品提的需求中有一个是更改APP中部分字体大小,虽然技术难度不大但工作量还是有的,思路是利用LayoutInflater.Factory实现的(如果你对LayoutInflater.Factory不熟悉可以阅读之前写的Android 源码系列之<四>从

Android进阶系列:八、自定义View之音频抖动动效

自定义动画效果--音频抖动效果 1.绘制一个矩形: 想要绘制一个矩形,继承View,并重写onDraw方法即可.复杂一点还可以重写onMeasure方法和onLayout方法进行大小测量和位置测量.但本文不打算写那么复杂的view,故只需要重写一个onDraw方法即可: private RectF rectF = new RectF();//绘制矩形 private float lineWidth = 50; private Paint paint = new Paint(); @Overrid

Android应用程序包解析过程浅析

我在上一篇文件中Android应用程序安装过程浅析粗略分析了一下Android应用程序安装过程,其中有一步说到了apk包的解析,但是没有详细分析,这里我们就来粗略分析一下包的解析过程. 流程图 执行过程 从上面的流程图可以看到,包的解析过程比安装过程执行步骤少很多,也简单一点.那我们就来详细的一步一步的进行剖析一下,我们从外部调用该方法开始分析: private void installPackageLI(InstallArgs args, PackageInstalledInfo res) {

android 加速度传感器妙用与自定义View

本节的实例是一个倾斜角度测量应用,它可以准确的测量出你手机与水平面的倾斜角度,使用的是android传感器里面的加速传感器.巧妙的运用了加速度传感器各个值所代表的物理意义,加上一个很简单的算法,就能测出倾斜角度. 角度值会随着手机的倾斜而准确显示,效果如图: 废话不多说直接上代码,上面有清楚的说明 package sina.CreAmazing.angle_view; import android.app.Activity; import android.content.Context; imp

Android——ViewPager滑动背景渐变(自定义view,ViewPager)

效果: ActivityBackgroundImage,java(自定义视图) package com.example.chenshuai.test322; import android.content.Context; import android.graphics.Canvas; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.util.Log; impor

Android UI 调试常用工具(Dump view UI hierarchy for Automator)

UI调试时程序员比较头疼的问题:有时候经常会被1dp.2dp的问题,搞得无言以对(Android开发深有体会) 下面介绍一个在实际开发过程中常用的一个调试工具,可以精确到每个View在屏幕中的绝对位置(精确到具体的px),有了这样的工具,就可以很好地找到UI中存在的问题了. 其实就是在DDMS视图下,使用Dump view UI hierarchy for Automator: 找到它也很简单的 1.Android studio(大家用了都说好 ),点击上面的小机器人 2.选择DDMS视图,找到