Android学习笔记の五

本文介绍如何在Android应用中创建自定义标题栏布局,并解释了android:layout_gravity与android:gravity的区别。此外还介绍了如何使用dp和sp单位确保应用在不同设备上的适配性,以及利用Nine-Patch图片保持图片在各种屏幕尺寸下的美观。

Android学习笔记の五


自定义控件

我们来自定义一个标题栏布局作为例子。

添加布局文件title.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/title_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:text="back"
        android:textColor="#000000" />

    <TextView
        android:id="@+id/title_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center" 
        android:text="Title"
        android:textColor="#000000"
        android:textSize="24sp" />

    <Button 
        android:id="@+id/title_edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="5dp"
        android:text="Edit"
        android:textColor="#000000" />


</LinearLayout>

问:android:layout_gravity和android_gravity有什么区别?
可能你一下就被问蒙了 ( ̄y▽ ̄)~*
我来告诉你,android:layout_gravity是控件在布局文件中的位置,而android:gravity是控件中的文字在控件中的位置。

然后在acivity_main中这么写,我们丑陋的标题栏就做完了(不要在意细节(>﹏<))

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include layout="@layout/title"/>

</LinearLayout>

需要什么布局只要include一下就好啦

我们的布局也绝不能是空架子!我们要让控件相应事件。
新建一个TitleLayout继承自LinearLayout

public class TitleLayout extends LinearLayout{

    public TitleLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        // TODO Auto-generated constructor stub
        /*infate的两个参数,第一个是要加载的布局文件的id,
        *第二个是给加载好的布局再加一个父布局,这里我们想要指定为TitleLayout,所以传入this*/
        LayoutInflater.from(context).inflate(R.layout.title, this);
        Button titleBack = (Button)findViewById(R.id.title_back);
        Button titleEdit = (Button)findViewById(R.id.title_edit);
        titleBack.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                /*销毁当前活动*/
                ((Activity)getContext()).finish();
            }

        });
        titleEdit.setOnClickListener(new OnClickListener(){

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(getContext(), "Edit Clicked", Toast.LENGTH_SHORT).show();
            }

        });
    }
}

从此再也不用重复写代码啦~

单位、尺寸

android设备屏幕的大小有N种,如何才能让你的应用在所有设备上都显示一直呢?
用dp表示大小!
dp是无关像素的意思,也称dip。 1dp是设备每英寸含的像素数
也就说dp是在按比例显示,而像素px是在按大小显示。比例是相对的,因此我们就解决了在不同分辨率的屏幕上显示的问题。
表示文字大小用sp,它和dp相类似。

sp和dp的区别

Android系统允许用户自定义文字尺寸大小(小、正常、大、超大等等),当文字尺寸是“正常”时1sp=1dp,而当文字尺寸是“大”或“超大”时,1sp>1dp英寸。

Nine-Patch图片

这是啥?有啥用?
。。。好,我们通过一个例子来说明。

先从网上随便照一张图(像素低一点)

然后这样修改activity_main

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/message_left" ></LinearLayout>

</LinearLayout>

run一下,就变成了这幅样子

明显被拉伸了。好难看= =

这时候Nine-Patch就登场了
在Android sdk目录下的tools文件夹有一个draw9patch.bat,打开它
用它打开刚才的图片,如下图

(呃。。自动无视卖萌的输入法

我们可以在四个边框上绘制黑点,上边框和左边框表示图片要拉伸的位置,下边和右边表示内容会被放置的区域
看下图

然后把绘制好的图片保存起来替换掉原来的图片,重新run

是不是好了很多呢~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值