什么是attr,实现自定义view

简介: Attr :单词的意思是属性的意思(但是这里的属性和xml控件中的属性不是一个意思,不要混淆!Attr说是属性只是说的是它的单词的意思是属性),我们是通过Attr文件来定义我们控件中所使用的属性的

什么是attr,实现自定义view



Attr基本概念


Attr :单词的意思是属性的意思(但是这里的属性和xml控件中的属性不是一个意思,不要混淆!Attr说是属性只是说的是它的单词的意思是属性),我们是通过Attr文件来定义我们控件中所使用的属性的,这样说可能大家会有一迷惑,那么来举个栗子:


比如我们在控件中最多使用的 layout_width 属性;


684c297dbf424a6e9b55a6a981341da7_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

8f4cbce87d4c4eceb21ab4ac84abf603_tplv-k3u1fbpfcp-zoom-in-crop-mark_4536_0_0_0.png

实现attr 自定义view



layout


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:custom="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <!--引用自定义view必须是包名.类名-->
    <com.boyoi.ysj.custom.one.view.YView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        custom:viewText="这是我的自定义View"
        custom:viewTextColor="@android:color/holo_red_dark"
        custom:viewTextBg="@android:color/holo_blue_dark"
        custom:viewTextSize="18sp" />
</LinearLayout>

自定义控件View  


/**
* Created by yishujun on 16/6/3.
*/
public class YView extends View {
    private Context mContext;
    //文本
    private String mText;
    //文本的颜色
    private int mTextColor;
    //文本的大小
    private int mTextSize;
    //文本的背景
    private int mTextBg;
    //绘制时控制文本绘制的范围
    private Rect mBound;
    //绘制文本画笔
    private Paint mPaint;
    public YView(Context context) {
        this(context, null);
    }
    public YView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public YView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.mContext = context;
        typedYView(attrs, defStyleAttr);
    }
    /**
     * 获得我们所定义的自定义样式属性
     *
     * @param attrs
     * @param defStyleAttr
     */
    private void typedYView(AttributeSet attrs, int defStyleAttr) {
        //获得我们所定义的自定义样式属性
        //final Resources.Theme theme = mContext.getTheme();
        //TypedArray a = theme.obtainStyledAttributes(attrs,R.styleable.YText, defStyleAttr, 0);
        //获取自定义属性值的方式一般情况分为两种:styleable组 和 直接获取attr属性
        //这里获取的属性用的styleable组,同时我也建议用这种方式方便规范attrs文件,
        //另外一种获取方式如下,当然也可以一个个获取属性值,这里不再演示
        //int[] custom = {R.attr.viewText, R.attr.viewTextSize};
        //TypedArray a = mContext.obtainStyledAttributes(attrs, custom);
        TypedArray a = mContext.getTheme().obtainStyledAttributes(attrs, R.styleable.YText, defStyleAttr, 0);
        int n = a.getIndexCount();
        for (int i = 0; i <= n; i++) {
            int attr = a.getIndex(i);
            switch (attr) {
                //注意获取属性的方式为 styleable的名称_属性名称
                case R.styleable.YText_viewText:
                    mText = a.getString(attr);
                    break;
                case R.styleable.YText_viewTextColor:
                    // 默认颜色设置为黑色
                    mTextColor = a.getColor(attr, Color.BLACK);
                    break;
                case R.styleable.YText_viewTextSize:
                    // 默认设置为16sp,TypeValue也可以把sp转化为px
                    mTextSize = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(
                            TypedValue.COMPLEX_UNIT_SP, 18, getResources().getDisplayMetrics()));
                    break;
                case R.styleable.YText_viewTextBg:
                    // 默认颜色设置为黄色
                    mTextBg = a.getColor(attr, Color.YELLOW);
                    //但是在这里上面的那种取值方式就是取不到值哦,因为返回后的attr没有YText_viewTextBg,原因是因为我刚装逼了一下,所以我们要单独去取值
                    break;
            }
        }
        //记得在这里单独取出文本的背景mTextBg值哦,因为上面的mTextBg取不到值哦
        mTextBg = a.getColor(R.styleable.YText_viewTextBg, Color.YELLOW);
        //回收资源
        a.recycle();
        //新建画笔对象
        mPaint = new Paint();
        //设置画笔
        mPaint.setTextSize(mTextSize);
        mBound = new Rect();
        //设置画笔绘制文字及相关区域
        mPaint.getTextBounds(mText, 0, mText.length(), mBound);
        this.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                mText = "你摸了我一下";
                //刷新画布
                postInvalidate();
            }
        });
    }
    @Override
    protected void onDraw(Canvas canvas) {
        //设置画布颜色即文字背景色
        mPaint.setColor(mTextBg);
        //绘制背景,全屏
        canvas.drawRect(0, 0, getMeasuredWidth(), getMeasuredHeight(), mPaint);
        //设置文字颜色
        mPaint.setColor(mTextColor);
        //绘制文字
        canvas.drawText(mText, getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint);
    }
}

attr 属性


<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--name 是自定义属性名,一般采用驼峰命名,可以随意。 format 是属性的单位-->
    <attr name="viewText" format="string" />
    <attr name="viewTextColor" format="color" />
    <attr name="viewTextSize" format="dimension" />
    <!--name 是自定义控件的类名-->
    <declare-styleable name="YText">
        <attr name="viewText" />
        <attr name="viewTextColor" />
        <attr name="viewTextSize" />
        <!--注意:一般情况是按照上面这样写,把属性单独定义在上面,然后在styleable这里面引用,但是我要装一下逼,就单独混写在里面了下,取值的时候就需要单独去取名称才能取到值不然是取不到值-->
        <attr name="viewTextBg" format="color" />
    </declare-styleable>
</resources>

定时器


public class TimerTest{     
    public static void main(String[] args){     
        Timer timer = new Timer();     
        timer.schedule(new MyTask(), 1000, 2000);//在1秒后执行此任务,每次间隔2秒执行一次,如果传递一个Data参数,就可以在某个固定的时间执行这个任务.     
        while(true){//这个是用来停止此任务的,否则就一直循环执行此任务     
            try{     
                int in = System.in.read();    
                if(in == 's'){     
                    timer.cancel();//使用这个方法退出任务     
                    break;  
                }     
            } catch (IOException e){     
                // TODO Auto-generated catch block     
                e.printStackTrace();     
            }     
        }     
    }    
    static class MyTask extends java.util.TimerTask{      
        public void run(){     
            System.out.println("________");     
        }     
    }    
}  


sendMessageDelayed


sendMessageDelayed是如何实现延时发送消息的? sendMessageDelayed是通过阻塞来达到了延时发送消息的结果,那么会不会阻塞新添加的Message?


android Module之间数据传递


(1)在子module创建回调接口(参数可变)


public interface OnChangeLisener { void onChanged(Date date); }


(2)在子module 实现类设置接口回调 //设置选择回调

public void setOnChangeLisener(OnChangeLisener onChangeLisener) { this.onChangeLisener = onChangeLisener; } 实现方法
onChangeLisener.onChanged(DateUtils.getDate(year, moth, day, hour, minut));


(3)在app module设置接口回调即可


private OnChangeLisener onChangeLisener; onChangeLisener =new OnChangeLisener() { @Override public void onChanged(Date date) { String messge = ""; } }; DatePickDialog dialog = new DatePickDialog(this); //设置选择回调 dialog.setOnChangeLisener(onChangeLisener);


方法二:使用 sharedpreferences 在一个module中保存数据


SharedPreferences sp = getSharedPreferences("sp_demo", Context.MODE_PRIVATE);sp.edit().
putString("name", "梅西").putInt("age", 11).commit();


在另一个module中获取数据


SharedPreferences sp = getSharedPreferences("sp_demo", Context.MODE_PRIVATE);
String name = sp.getString("name", null);int age = sp.getInt("age", 0);
相关文章
|
6月前
|
存储 弹性计算 调度
阿里云服务器实例选型参考:共享型与企业级实例性能与使用场景区别及选择参考
阿里云服务器实例从产品规格角度来说,主要分为共享型和企业级。共享型主要有突发性能 t5、t6 实例以及共享 N4、S6 以及经济型e等实例规格,企业级(也称独享型)实例有计算型、通用型、内存型等众多实例规格,那么,这两种类型的实例究竟有什么区别?作为用户又应该如何做出合适的选择呢?接下来,本文为大家介绍共享型与企业级实例性能与使用场景区别及选择参考。
311 10
|
NoSQL Redis
Redis 之 WRONGTYPE Operation against a key holding the wrong kind of value【bug解决】
Redis 之 WRONGTYPE Operation against a key holding the wrong kind of value【bug解决】
11318 0
|
机器学习/深度学习 数据采集 算法
Python使用随机森林模型进行电影评分预测
Python使用随机森林模型进行电影评分预测
1886 1
Python使用随机森林模型进行电影评分预测
|
存储 安全 Linux
Linux sync 指令的作用
Linux sync 命令的作用是确保所有未写入磁盘的数据被立即同步至物理存储介质上,以保护文件系统的一致性和防止意外关机时的数据丢失。虽然 sync 在日常交互式使用中可能不常直接调用,但许多高级操作或脚本中会包含此命令来保证数据安全。
618 0
|
网络安全 数据中心 网络架构
【专栏】标准19英寸机架及其尺寸单位1U和2U在数据中心和通信机房中的应用
【4月更文挑战第28天】本文介绍了标准19英寸机架及其尺寸单位1U和2U在数据中心和通信机房中的应用。19英寸机架是国际标准,宽度48.26厘米,深度可定制。1U等于4.445厘米,2U是1U的两倍。1U设备适用于空间有限的情况,2U则提供更大空间和更好的散热。选择机架时需考虑空间、散热和电力需求,设备布局要保证散热和电缆管理。理解这些标准对于优化空间利用和系统管理至关重要。
1937 0
|
存储 NoSQL 分布式数据库
数据库的介绍、分类、作用和特点
数据库的介绍、分类、作用和特点
590 0
详解CAN总线:CAN总线报文格式—遥控帧
CAN总线上传输的信息称为报文,当总线空闲时任何连接的单元都可以开始发送新的报文。
华为机试HJ106:字符逆序
华为机试HJ106:字符逆序
217 1
|
存储 XML 编解码
探索现代图片格式:从GIF到HEIF,优势与适用场景一览-2
使用场景: JPEG适用于各种需要高度压缩、广泛兼容性以及不需要透明背景的场景。它特别适用于摄影、照片、艺术品等复杂图像的存储和展示。
849 0