Android开发-自定义View-AndroidStudio(八)自定义View初体验

转载请注明出处: http://blog.csdn.net/iwanghang/article/details/53783417
觉得博文有用,请点赞,请评论,请关注,谢谢!~
老规矩,先上效果图,看个效果,如果符合你的项目或者确定你要了解的内容,再往下看吧:

MainActivity.java:
package com.iwanghang.autoattribute;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
MyAttributeView.java:
package com.iwanghang.autoattribute;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;

public class MyAttributeView extends View {

    private int age;
    private String name;
    private int text_size;
    private Bitmap bg;
    private Bitmap bg2;

    public MyAttributeView(Context context, AttributeSet attrs) {
        super(context, attrs);

        // 获取属性三种方式

        // 1、用命名空间获取
        String my_name = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto","my_name");
        String my_age = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto","my_age");
        String my_bg = attrs.getAttributeValue("http://schemas.android.com/apk/res-auto","my_bg");
        System.out.println("ceshi 用命名空间获取 = my_name = "+ my_name + ", my_age = "+ my_age + ", my_bg = "+ my_bg);

        // 2、遍历属性集合
        for (int i = 0; i <attrs.getAttributeCount() ; i++) {
            System.out.println("ceshi 遍历属性集合 = " + attrs.getAttributeName(i) + " | " + attrs.getAttributeValue(i));
        }

        // 3、使用系统工具,获取属性
        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:
                    age = typedArray.getInt(index,0);
                    break;
                case R.styleable.MyAttributeView_my_name:
                    name = typedArray.getString(index);
                    System.out.println("ceshi2 name = " + name);
                    break;
                case R.styleable.MyAttributeView_text_size:
                    text_size = typedArray.getDimensionPixelSize(index, 0);
                    break;
                case R.styleable.MyAttributeView_my_bg:
                    Drawable drawable = typedArray.getDrawable(index);
                    BitmapDrawable drawable1 = (BitmapDrawable) drawable;
                    bg = drawable1.getBitmap();
                    break;
                case R.styleable.MyAttributeView_my_bg_2:
                    Drawable drawable3 = typedArray.getDrawable(index);
                    BitmapDrawable drawable4 = (BitmapDrawable) drawable3;
                    bg2 = drawable4.getBitmap();
                    break;
            }
        }

        // 记得回收
        typedArray.recycle();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();
        if (text_size != 0) {
            // Layout中如果设置字体大小,则设置为Layout中字体大小
            paint.setTextSize(text_size);
        }else {
            // Layout中如果没有设置字体大小,则20sp
            paint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics()));
        }
        canvas.drawText(name,50,50,paint);
        canvas.drawText(String.valueOf(age),50,100,paint);


        //canvas.drawBitmap(bg,50,150,paint);
        canvas.drawBitmap(bg,null,new Rect(0,0,650,500),null);
        canvas.drawBitmap(bg2,null,new Rect(100,450,550,750),null);
    }

}
activity_main.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:iwanghang="http://schemas.android.com/apk/res-auto"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.iwanghang.autoattribute.MainActivity">

    <com.iwanghang.autoattribute.MyAttributeView
        iwanghang:my_age="100"
        iwanghang:my_name="_iwanghang_"
        iwanghang:text_size="30sp"
        iwanghang:my_bg="@drawable/christmas"
        iwanghang:my_bg_2="@drawable/c2"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <!--如果删除这句,默认字体大小为20sp-->
    <!--iwanghang:text_size="30sp"-->
</RelativeLayout>
attrs.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="MyAttributeView">
        <attr name="my_age" format="integer"/>
        <attr name="my_name" format="string" />
        <attr name="text_size" format="dimension" />
        <attr name="my_bg" format="reference|color"/>
        <attr name="my_bg_2" format="reference|color"/>
    </declare-styleable>
</resources>


转载请注明出处: http://blog.csdn.net/iwanghang/article/details/53783417



欢迎移动开发爱好者交流
沈阳或周边城市公司有意开发Android,请与我联系
联系方式

微信:iwanghang
QQ:413711276
邮箱:iwanghang@qq.com



觉得博文有用,请点赞,请评论,请关注,谢谢!~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值