Android 3

dp,sp,px

说明
px
dp
sp

Inflater

获取Inflater的三种方式
方式
getLayoutInflater
getSystemService(LAYOUT_INFLATER_SERVICE)
LayoutInflater.from(context)

提取布局属性

1.Theme 是窗体级别的,改变窗体样式
2.改变指定控件或layout的样式

style是可以继承的
属性的优先原则是,控件属性>style>style的父类

自定义控件(2)

View是如何工作的
方法说明
1构造器
2onMesure()
3onLayout()
4onDraw()
5invalidate()
下边介绍一下具体的代码

首先,创建一个自定义控件类

    public class RoundButton extends View {

        private Paint buttonPaint = null;

        private Rect rect = null;

        private Integer count = 0;

        private Integer backgroundColor;


        public RoundButton(Context context) {
            this(context, null);
        }

        public RoundButton(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }

        public RoundButton(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            init(context, attrs);
        }

        //初始化,实例化必要的对象,获取自定义属性
        private void init(Context context, AttributeSet attrs) {
            buttonPaint = new Paint();
            rect = new Rect();

            // 获取自定义属性集合
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.RoundButton);
            // 获取一个自定义控件的属性,第一个参数是,属性名称,第二个参数是默认值,即未指定此属性值的情况下,将使用默认值
            backgroundColor = typedArray.getColor(R.styleable.RoundButton_backgroundColor, Color.RED);

            // 给此自定义控件添加单击事件
            setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View view) {
                    //每次点击 +1
                    ++count;
                    // 刷新
                    invalidate();
                }
            });
        }

        //绘制
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            // 设置颜色
            buttonPaint.setColor(backgroundColor);
            // 在画布上绘制一个圆形
            canvas.drawCircle(240, 240, 200, buttonPaint);

            buttonPaint.setColor(Color.WHITE);
            buttonPaint.setTextSize(100);
            // 通过getTextBounds获取一个字符串将要占用的大小
            buttonPaint.getTextBounds(count.toString(), 0, count.toString().length(), rect);
            //通过上边取得的区域大小(rect实例),通过计算使文字显示在中心
            canvas.drawText(count.toString(), 240 - rect.width() / 2, 240 + rect.height() / 2, buttonPaint);

        }
    }

不要忘记,还需要在layout中定义出来哦,如下:

    <?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:app="http://schemas.android.com/apk/res-auto"
        tools:context="com.lisen.part3.ShowActivity">


        <com.lisen.part3.RoundButton //使用的自定义控件
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:backgroundColor="#4444ff"/>


    </RelativeLayout>
自定义属性

在创建自己的控件后,就可以给它创建属于自己的属性了.
这里我们继续使用上边的自定义控件,这里一眼就可以看出有一个自定义属性app:backgroundColor=”#4444ff”
之所以有app:是因为这句话xmlns:app=”http://schemas.android.com/apk/res-auto” 一个xml命名空间

自定义属性需要创建在attrs.xml中,如果没有的话,可以在res/values目录下创建
内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="RoundButton">
            <attr name="backgroundColor" format="color" />
        </declare-styleable>
    </resources>

Fragment 碎片

在一个活动上,我们可以显示或隐藏一个更小的活动,而这种活动称为碎片.它可以让我们更充分的利用屏幕并且达到更好的用户体验

如何创建一个碎片

    public class BlankFragment extends Fragment { //这里新建一个类,继承Fragment,这里的Fragment是android.app.Fragment

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            // 读取一个视图文件并解析
            return inflater.inflate(R.layout.fragment_blank, container, true);
        }
    }

以下是在一个Activity中所写的代码


    // Activity 的 onCreate事件
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_show_fragment);

        // 获取一个碎片管理器
        FragmentManager fragmentManager = getFragmentManager();

        // 开始碎片事务
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

        BlankFragment blank = new BlankFragment();
        // 通过add方法添加碎片,并提交事务.
        // 这里的R.id.layoutTest 是在当前的Activity的layout文件中创建的布局
        fragmentTransaction.add(R.id.layoutTest, blank).commit();
    }

BroadcastReceiver 广播

广播存在系统广播与自定义广播,系统广播主要有Android自己发送,例如:电量不足

广播的注册方式:
1.静默注册
静默注册,即在AndroidManifest.xml 中注册.例如:

```xml
<receiver
    android:name=".broadcastreceiver.MyReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter> //一个过滤器
        <action android:name="com.xxx.broadcastreceiver" /> //只接收来此自定义的广播
    </intent-filter>
</receiver>
```

2.动态注册

    public class BroadcastActivity extends AppCompatActivity implements View.OnClickListener {

        public static final String ACTION = "com.lisen.part3.broadcast";
        private MyReceiver myReceiver = new MyReceiver();

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_broadcast);

            //创建一个过滤器
            IntentFilter intentFilter = new IntentFilter();
            // 设置要接收的标识
            intentFilter.addAction(ACTION);
            // 注册广播
            registerReceiver(myReceiver, intentFilter);

            Button btnSend = (Button) findViewById(R.id.btnSend);
            btnSend.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btnSend:
                    Intent intent = new Intent();
                    intent.setAction(ACTION); //这里的Action即我们上边定义的标识,如果不同那么就永远不会受到广播
                    intent.putExtra("msgInfo", "我是广播,我来了!");

                    sendBroadcast(intent); //发送广播
                    break;
            }
        }
    }

如何接收广播

    public class MyReceiver extends BroadcastReceiver {
        public MyReceiver() {
        }

        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent != null) {
                // 比较标识是否为中我们想接收的广播,这里做的判断是为了防止出现同时接收到多个我们允许的广播.(即在intent-filter中定义了多个)
                if (TextUtils.equals(intent.getAction(), BroadcastActivity.ACTION)) {
                    Toast.makeText(context, intent.getStringExtra("msgInfo"), Toast.LENGTH_LONG).show();
                }
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值