zoukankan      html  css  js  c++  java
  • 关于自定义View

    关于自定义View

    自定义View的分类

    • 继承View重写onDraw方法
    • 继承ViewGroup派生特殊的Layout
    • 继承特定的View例如TextView
    • 继承特定的ViewGroup例如LinearLayout

    自定义View的步骤

    • 继承 View 或者 View 的子类
    • 在 res/values/attrs.xml 声明属性集合
    • 将自定义 View 放到布局文件中,需要完整全类名,命名空间不再是android,xmlns:custom="http://schemas.android.com/apk/res/[自定义 View 所在的包路径]"
    • 在 xml 文件中设定指定属性值
    • 获取自定义属性,并且为 View 设置必要的事件
    • 进行自定义的绘制,实现 onDraw 方法,甚至 onMeasure,onLayout等等
    • 覆写 onTouch 等事件相关方法
    • 优化自定义的 View,比如为了减低刷新频率可以在 onDraw 中调用四个参数 的 invalidate 方法,因为无参的 invalidate 方法刷新的是整个 View 树,而四个参数的 invalidate 方法刷新的是指定部分的 View。等等。

    自定义属性

    • 在res/values/attrs.xml文件自定义属性
    • 继承View
    • 在自定义View中获取属性集合
    • 给View添加设置属性
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <!--定义名字叫MyAttributeView属性集合-->
        <declare-styleable name="MyAttributeView">
            <!--定义一个名字叫my_name并且类型是string的属性-->
            <attr name="my_name" format="string"/>
            <attr name="my_age" format="integer"/>
            <attr name="my_bg" format="reference|color"/>
        </declare-styleable>
    </resources>
    
    <!--使用自定义View的时候设置自定义属性-->
    <cy.review.customattributes.MyAttributeView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:my_age="100"
            app:my_bg="@drawable/jtx"
            app:my_name="android0220"/>
    
    public class MyAttributeView extends View {
        private int myAge;
        private String myName;
        private Bitmap myBg;
    
        public MyAttributeView(Context context, AttributeSet attrs) {
            super(context, attrs);
    
            //获得属性集合
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.MyAttributeView);
            for (int i = 0; i < typedArray.getIndexCount(); i++) {
                int index = typedArray.getIndex(i);
    
                switch (index) {
                    case R.styleable.MyAttributeView_my_age:
                        myAge = typedArray.getInt(index, 0);
                        break;
                    case R.styleable.MyAttributeView_my_name:
                        myName = typedArray.getString(index);
                        break;
                    case R.styleable.MyAttributeView_my_bg:
                        Drawable drawable = typedArray.getDrawable(index);
                        BitmapDrawable drawable1 = (BitmapDrawable) drawable;
                        myBg = drawable1.getBitmap();
                        break;
                }
            }
            // 记得回收
            typedArray.recycle();
        }
        
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Paint paint = new Paint();
            canvas.drawText(myName + "---" + myAge, 50, 50, paint);
            canvas.drawBitmap(myBg, 50, 50, paint);
        }
    }
    
  • 相关阅读:
    ASP.NET使用Coolite.Ext.Web.dll,显示ext"未定义"的解决方法
    浏览器引擎模式与DOCTYPE
    MVC 参数如何自动绑定数组对象
    IIS7.5 配置 PHP
    TFSDeleteProject:删除团队项目
    自动生成存储过程一
    如何更新ntext字段信息
    清除所有默认样式的CSS代码
    自定义动作过滤器属性
    IE9点击别的网页弹出空白页
  • 原文地址:https://www.cnblogs.com/chen-ying/p/12391005.html
Copyright © 2011-2022 走看看