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 | 构造器 |
2 | onMesure() |
3 | onLayout() |
4 | onDraw() |
5 | invalidate() |
下边介绍一下具体的代码
首先,创建一个自定义控件类
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();
}
}
}
}