@ViewDebug.ExportedProperty的使用

  • 原文链接:http://daemon369.github.io/android/2014/06/12/android-viewdebug-exportedproperty/
  • http://www.eoeandroid.com/thread-55461-1-1.html;

This annotation can be used to mark fields and methods to be dumped by the view server. Only non-void methods with no arguments can be annotated by this annotation. 
这个注释可以用来标记域和方法,该域和方法将会被视服务所“转存”,只有不带参数的非空方法才能被这个注释所诠释;

在查看View源码时,但不清楚@ViewDebug.ExportedProperty的用法:

    /**
     * The view flags hold various views states.
     * {@hide}
     */
    @ViewDebug.ExportedProperty
    int mViewFlags;

    /**
     * The distance in pixels from the left edge of this view‘s parent
     * to the left edge of this view.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "layout")
    protected int mLeft;
    /**
     * The distance in pixels from the left edge of this view‘s parent
     * to the right edge of this view.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "layout")
    protected int mRight;
    /**
     * The distance in pixels from the top edge of this view‘s parent
     * to the top edge of this view.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "layout")
    protected int mTop;
    /**
     * The distance in pixels from the top edge of this view‘s parent
     * to the bottom edge of this view.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "layout")
    protected int mBottom;

    /**
     * The offset, in pixels, by which the content of this view is scrolled
     * horizontally.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "scrolling")
    protected int mScrollX;
    /**
     * The offset, in pixels, by which the content of this view is scrolled
     * vertically.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "scrolling")
    protected int mScrollY;

    /**
     * The left padding in pixels, that is the distance in pixels between the
     * left edge of this view and the left edge of its content.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "padding")
    protected int mPaddingLeft;
    /**
     * The right padding in pixels, that is the distance in pixels between the
     * right edge of this view and the right edge of its content.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "padding")
    protected int mPaddingRight;
    /**
     * The top padding in pixels, that is the distance in pixels between the
     * top edge of this view and the top edge of its content.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "padding")
    protected int mPaddingTop;
    /**
     * The bottom padding in pixels, that is the distance in pixels between the
     * bottom edge of this view and the bottom edge of its content.
     * {@hide}
     */
    @ViewDebug.ExportedProperty(category = "padding")
    protected int mPaddingBottom;

    /**
     * Briefly describes the view and is primarily used for accessibility support.
     */
    private CharSequence mContentDescription;

    /**
     * Cache the paddingRight set by the user to append to the scrollbar‘s size.
     */
    @ViewDebug.ExportedProperty(category = "padding")
    int mUserPaddingRight;

    /**
     * Cache the paddingBottom set by the user to append to the scrollbar‘s size.
     */
    @ViewDebug.ExportedProperty(category = "padding")
    int mUserPaddingBottom;


使用@ViewDebug.ExportedProperty注解,我们可以在android提供的工具Monitor(或已经废弃的DDMS)中的Hierarchy Viewer中调试View的属性。我们可以直接观察View的某个变量或方法的值,实时观察View的状态变化。


ExprotedProperty注解源码

/**
 * This annotation can be used to mark fields and methods to be dumped by
 * the view server. Only non-void methods with no arguments can be annotated
 * by this annotation.
 */
@Target({ ElementType.FIELD, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface ExportedProperty {
    /**
     * When resolveId is true, and if the annotated field/method return value
     * is an int, the value is converted to an Android‘s resource name.
     *
     * @return true if the property‘s value must be transformed into an Android
     *         resource name, false otherwise
     */
    boolean resolveId() default false;
    /**
     * A mapping can be defined to map int values to specific strings. For
     * instance, View.getVisibility() returns 0, 4 or 8. However, these values
     * actually mean VISIBLE, INVISIBLE and GONE. A mapping can be used to see
     * these human readable values:
     *
     * <pre>
     * @ViewDebug.ExportedProperty(mapping = {
     *     @ViewDebug.IntToString(from = 0, to = "VISIBLE"),
     *     @ViewDebug.IntToString(from = 4, to = "INVISIBLE"),
     *     @ViewDebug.IntToString(from = 8, to = "GONE")
     * })
     * public int getVisibility() { ...
     * <pre>
     *
     * @return An array of int to String mappings
     *
     * @see android.view.ViewDebug.IntToString
     */
    IntToString[] mapping() default { };
    /**
     * A mapping can be defined to map array indices to specific strings.
     * A mapping can be used to see human readable values for the indices
     * of an array:
     *
     * <pre>
     * @ViewDebug.ExportedProperty(indexMapping = {
     *     @ViewDebug.IntToString(from = 0, to = "INVALID"),
     *     @ViewDebug.IntToString(from = 1, to = "FIRST"),
     *     @ViewDebug.IntToString(from = 2, to = "SECOND")
     * })
     * private int[] mElements;
     * <pre>
     *
     * @return An array of int to String mappings
     *
     * @see android.view.ViewDebug.IntToString
     * @see #mapping()
     */
    IntToString[] indexMapping() default { };
    /**
     * A flags mapping can be defined to map flags encoded in an integer to
     * specific strings. A mapping can be used to see human readable values
     * for the flags of an integer:
     *
     * <pre>
     * @ViewDebug.ExportedProperty(flagMapping = {
     *     @ViewDebug.FlagToString(mask = ENABLED_MASK, equals = ENABLED, name = "ENABLED"),
     *     @ViewDebug.FlagToString(mask = ENABLED_MASK, equals = DISABLED, name = "DISABLED"),
     * })
     * private int mFlags;
     * <pre>
     *
     * A specified String is output when the following is true:
     *
     * @return An array of int to String mappings
     */
    FlagToString[] flagMapping() default { };
    /**
     * When deep export is turned on, this property is not dumped. Instead, the
     * properties contained in this property are dumped. Each child property
     * is prefixed with the name of this property.
     *
     * @return true if the properties of this property should be dumped
     *
     * @see #prefix()
     */
    boolean deepExport() default false;
    /**
     * The prefix to use on child properties when deep export is enabled
     *
     * @return a prefix as a String
     *
     * @see #deepExport()
     */
    String prefix() default "";
    /**
     * Specifies the category the property falls into, such as measurement,
     * layout, drawing, etc.
     *
     * @return the category as String
     */
    String category() default "";
}

  


使用

下面是@ViewDebug.ExportedProperty注解的部分属性的使用介绍:

1.category

category用来指定属性的类别,例如measurement, layout, drawing等。我们在自定义View中为使用@ViewDebug.ExportedProperty注解的变量或方法指定category:

@ExportedProperty(category = "marquee")
int x = 1;

@Override
@ExportedProperty(category = "marquee")
public boolean isFocused() {
    return true;
}

运行程序,在Hierarchy Viewer中查看View的属性如下:

2.resolveId

当resolveId为true时,如果使用注解的变量或方法的值为int数据,那么这个值会被转化为对应的Android资源的名称。

在R.java中找到一个资源ID:

public static final int activity_main=0x7f030000;

使用注解属性resolveId:

@ExportedProperty(category = "marquee", resolveId = true)
int b = 0x7f030000;

结果如下:

3.mapping

mapping可以将int值映射到指定的字符串值,例如View.getVisibility()返回的值是int值,View中使用注解将其映射为字符串,其中0为”VISIBLE”,4为”INVISIBLE”,8为”GONE”。我们重载View.getVisibility()并加上我们自己定制的映射:

@Override
@ViewDebug.ExportedProperty(category = "marquee",
        mapping = {
                @ViewDebug.IntToString(from = VISIBLE, to = "MARQUEE_VISIBLE"),
                @ViewDebug.IntToString(from = INVISIBLE, to = "MARQUEE_INVISIBLE"),
                @ViewDebug.IntToString(from = GONE, to = "MARQUEE_GONE")
        })
public int getVisibility() {
    return super.getVisibility();
}

结果如下:

4.indexMapping

indexMapping可以将数组的序号映射为字符串。

@ExportedProperty(category = "marquee",
        indexMapping = {
                @ViewDebug.IntToString(from = 0, to = "MARQUEE_FIRST"),
                @ViewDebug.IntToString(from = 1, to = "MARQUEE_SECOND"),
                @ViewDebug.IntToString(from = 2, to = "MARQUEE_THIRD")
        })
int[] elements = new int[] {
        111, 222, 333
};

结果如下:


Demo

package com.daemon.demo;

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.ViewDebug;
import android.view.ViewDebug.ExportedProperty;
import android.widget.TextView;

public class MarqueeText extends TextView {

    public MarqueeText(Context context) {
        super(context);
    }

    public MarqueeText(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MarqueeText(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
    }

    @ExportedProperty(category = "marquee")
    int x = 1;

    @Override
    @ExportedProperty(category = "marquee")
    public boolean isFocused() {
        return true;
    }

    @ExportedProperty(category = "marquee", resolveId = true)
    int b = 0x7f030000;

    @Override
    @ViewDebug.ExportedProperty(category = "marquee",
            mapping = {
                    @ViewDebug.IntToString(from = VISIBLE, to = "MARQUEE_VISIBLE"),
                    @ViewDebug.IntToString(from = INVISIBLE, to = "MARQUEE_INVISIBLE"),
                    @ViewDebug.IntToString(from = GONE, to = "MARQUEE_GONE")
            })
    public int getVisibility() {
        return super.getVisibility();
    }

    @ExportedProperty(category = "marquee",
            indexMapping = {
                    @ViewDebug.IntToString(from = 0, to = "MARQUEE_FIRST"),
                    @ViewDebug.IntToString(from = 1, to = "MARQUEE_SECOND"),
                    @ViewDebug.IntToString(from = 2, to = "MARQUEE_THIRD")
            })
    int[] elements = new int[] {
            111, 222, 333
    };
}

 

时间: 2024-10-04 08:04:52

@ViewDebug.ExportedProperty的使用的相关文章

lua 语句学习

版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet att

HDU1237 简单计算器 【栈】+【逆波兰式】

版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet att

Android SwitchButton(滑动开关)

版本:1.0 日期:2014.5.17 2014.6.1 版权:© 2014 kince 转载注明出处 在介绍SwitchButton之前,先来看一下系统Button是如何实现的.源码如下: @RemoteView public class Button extends TextView { public Button(Context context) { this(context, null); } public Button(Context context, AttributeSet att

android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明

涉及到滑动,就涉及到VIEW,大家都知道,android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类,ViewGroup作为各个组件的容器搭建了整体的UI.以下是android UI的结构示示意图: 查看源码 /** * Implement this to do your drawing. * * @param canvas the canvas on which the background w

Android开发艺术探索——第七章:Android动画深入分析

Android开发艺术探索--第七章:Android动画深入分析 Android的动画可以分成三种,view动画,帧动画,还有属性动画,其实帧动画也是属于view动画的一种,,只不过他和传统的平移之类的动画不太一样的是表现形式上有点不一样,view动画是通过对场景的不断图像交换而产生的动画效果,而帧动画就是播放一大段图片,很显然,图片多了会OOM,属性动画通过动态的改变对象的属性达到动画效果,也是api11的新特性,在低版本无法使用属性动画,但是我们依旧有一些兼容库,OK,我们还是继续来看下详细

和我一起看API(一)你所不知道的LinearLayout

楼主英语水平差,翻译的不好的话请多多指正,嘿嘿... A Layout that arranges its children in a single column or a single row. The direction of* the row canbe set by calling {@link #setOrientation(int) setOrientation()}.* You can also specify gravity, which specifies thealignme

Android View measure (二) 自定义UI控件measure相关

本篇模拟三个角色:Android 架构师-小福.Android  控件开发工程师-小黑. Android 开发工程师-小白,下面按照三个角色不同角度分析measure过程. 小福负责分享: measure的本质 measure代码流程 onMeasure方法与MeasureSpec 提出问题 小黑负责分享: 布局控件开发中覆写Measure例子 - ok 从遇到的一个异常说起 什么时候需要覆写onMeaure? - ok view.getWidth与view.getMeasureWidth区别

Android scrollTo() scrollBy() Scroller解说及应用

版本号:1.0 日期:2014.6.17  2014.6.18 版权:? 2014 kince 转载注明出处 scrollTo() .scrollBy()及 Scroller在视图滑动中常常使用到.比方最常见的Launcher就是用这种方式实现. 为了更加明了的理解.还是去看一下源代码.在View类中.scrollTo的代码例如以下: /** * Set the scrolled position of your view. This will cause a call to * {@link

自定义TextView使之具有跑马灯的效果

一.问题的引入 使用普通的textview跑马的效果,一开始没有焦点事件不会进行滚动,button有焦点事件,但是比较难看,因此需要自定一个TextView 一出生就有焦点 然后需要自定义一个textview FocusedTextView.java package com.xuliugen.mobilesafe.ui; import android.content.Context; import android.util.AttributeSet; import android.view.Vi