精华内容
下载资源
问答
  • 大致思路: **第一种:**在主布局下增加另外一个xml布局文件。在Activity可以通过findViewById改变另一个xml文件的控件来使该控件在主布局相应地改变。 **第二种:**在主布局下动态增加多个自定义样式控件。

    工程目录:
    在这里插入图片描述
    MainActivity

    package com.example.test1121;
    
    import androidx.appcompat.app.ActionBar;
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.AsyncTask;
    import android.os.Bundle;
    import android.text.method.ScrollingMovementMethod;
    import android.util.DisplayMetrics;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.widget.Button;
    import android.widget.LinearLayout;
    import android.widget.RelativeLayout;
    import android.widget.TextView;
    
    import java.util.ArrayList;
    
    public class MainActivity extends AppCompatActivity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            ActionBar bar=getSupportActionBar();
            bar.hide();
    
            //增加XML样式控件布局
            final LayoutInflater inflater = LayoutInflater.from(this);
    
            //被插入的布局
            final LinearLayout layout1 = (LinearLayout) findViewById(R.id.linearLayout);
    
            //插入的布局
            LinearLayout layout2 = (LinearLayout) inflater.inflate(R.layout.btn_layout, null).findViewById(R.id.btn_layout);
            layout1.addView(layout2);
    
            //动态增加自定义xml样式控件
            String s="我是动态增加的自定义xml样式按钮";
            char c[]=s.toCharArray();
            for(char t:c){
                final Button btn=new Button(getApplicationContext());
                btn.setBackgroundResource(R.drawable.btn_style);
                btn.setText(""+t);
                btn.setTextSize(12);
                btn.setOnClickListener(new View.OnClickListener(){
                    @Override
                    public void onClick(View v) {
                        btn.setWidth(72);
                        btn.setHeight(72);
                        v.setMinimumHeight(72);
                        v.setMinimumWidth(72);
                    }
                });
                layout2.addView(btn);
    
                //之所以在这里回调onclick是因为在绘制图形时有一个绘制时间,get/setHeight、get/setWidth来设置控件会显示高宽为0,用了好多方法,只有这个方法有效
                btn.callOnClick();
            }
        }
    }
    

    btn_style.xml

    <?xml version="1.0" encoding="utf-8"?>
    <selector xmlns:android="http://schemas.android.com/apk/res/android">
        <!--按下-->
        <item android:state_pressed="true">
            <shape>
                <gradient android:startColor="#90CAF9" android:endColor="#90CAF9"
                    android:angle="270" />
                <stroke android:width="1px" android:color="#0088F1FF" />
                <corners android:radius="25dip" />
                <padding android:left="10dp" android:top="10dp"
                    android:right="10dp" android:bottom="10dp" />
                <size android:height="10dp" android:width="10dp"/>
                <size
                    android:width="10dp"  android:height="10dp" />
            </shape>
        </item>
    
        <!--抬起-->
        <item>
            <shape>
                <gradient android:startColor="#C5E1A5" android:endColor="#C5E1A5"
                    android:angle="180" />
                <stroke android:width="1px" android:color="#00111010" />
                <corners android:radius="25dip" />
                <padding android:left="0dp" android:top="0dp"
                    android:right="0dp" android:bottom="0dp" />
                <size
                    android:width="10dp"  android:height="10dp" />
            </shape>
        </item>
    </selector>
    

    activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <HorizontalScrollView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:scrollbars="none">
                <LinearLayout
                    android:id="@+id/linearLayout"
                    android:layout_width="match_parent"
                    android:layout_height="36dp"
                    android:gravity="center"
                    android:orientation="horizontal">
                </LinearLayout>
            </HorizontalScrollView>
        </LinearLayout>
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    btn_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/btn_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
    
        <Button
            android:id="@+id/btn0"
            android:background="@drawable/btn_style"
            android:layout_width="34sp"
            android:textSize="12dp"
            android:layout_height="34sp"
            android:text="1"/>
        <Button
            android:id="@+id/btn1"
            android:background="@drawable/btn_style"
            android:layout_width="34sp"
            android:textSize="12dp"
            android:layout_height="34sp"
            android:text="2"/>
        <Button
            android:id="@+id/btn2"
            android:background="@drawable/btn_style"
            android:layout_width="34sp"
            android:textSize="12dp"
            android:layout_height="34sp"
            android:text="3"/>
        <Button
            android:id="@+id/btn3"
            android:background="@drawable/btn_style"
            android:layout_width="34sp"
            android:textSize="12dp"
            android:layout_height="34sp"
            android:text="4"/>
    </LinearLayout>
    

    在这里插入图片描述
    以上就是在Android的Activity中动态增加布局和控件的两种方法。
    大致思路:
    **第一种:**在主布局下增加另外一个xml布局文件。在Activity中可以通过findViewById改变另一个xml文件中的控件来使该控件在主布局中相应地改变。
    **第二种:**在主布局下动态增加多个自定义样式控件。

    展开全文
  • android XML布局大全

    万次阅读 2012-10-18 08:59:30
    指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串 android:gravity 指定View组件的对齐方式,比如说居中,居右等位置 这里指的是控件的文本位置并不是控件本身 android:layout_...
    第一类:属性值为true或false
    
    android:layout_centerHrizontal  水平居中
    android:layout_centerVertical   垂直居中
    android:layout_centerInparent    相对于父元素完全居中
    android:layout_alignParentBottom 贴紧父元素的下边缘
    android:layout_alignParentLeft   贴紧父元素的左边缘
    android:layout_alignParentRight  贴紧父元素的右边缘
    android:layout_alignParentTop    贴紧父元素的上边缘
    android:layout_alignWithParentIfMissing  如果对应的兄弟元素找不到的话就以父元素做参照物
    第二类:属性值必须为id的引用名”
    android:layout_below      在某元素的下方
    android:layout_above      在某元素的的上方
    android:layout_toLeftOf   在某元素的左边
    android:layout_toRightOf  在某元素的右边
    android:layout_alignTop   本元素的上边缘和某元素的的上边缘对齐
    android:layout_alignLeft  本元素的左边缘和某元素的的左边缘对齐
    android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
    android:layout_alignRight  本元素的右边缘和某元素的的右边缘对齐
    第三类:属性值为具体的像素值,如30dip,40px
    android:layout_marginBottom       离某元素底边缘的距离
    android:layout_marginLeft         离某元素左边缘的距离
    android:layout_marginRight        离某元素右边缘的距离
    android:layout_marginTop          离某元素上边缘的距离
    EditText的android:hint  设置EditText为空时输入框内的提示信息。
    android:gravity 
    android:gravity属性是对该view 内容的限定.比如一个button 上面的text.  你可以设置该text 在view的靠左,靠右等位置.以button为例,android:gravity="right"则button上面的文字靠右
    android:layout_gravity
    android:layout_gravity是用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity="right"则button靠右
    android:scaleType:
    android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别:
    CENTER /center  按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
    CENTER_CROP / centerCrop  按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
    CENTER_INSIDE / centerInside  将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
    FIT_CENTER / fitCenter  把图片按比例扩大/缩小到View的宽度,居中显示
    FIT_END / fitEnd   把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
    FIT_START / fitStart  把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
    FIT_XY / fitXY  把图片不按比例扩大/缩小到View的大小显示
    MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
    ** 要注意一点,Drawable文件夹里面的图片命名是不能大写的。
    -------------------------------------------------------------------------------------------------------------------------------------------------------------
    android:id
    为控件指定相应的ID
    android:text
    指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串
    android:gravity
    指定View组件的对齐方式,比如说居中,居右等位置 这里指的是控件中的文本位置并不是控件本身
    android:layout_gravity
    指定Container组件的对齐方式.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为 例,android:layout_gravity="right"则button靠右
    android:textSize
    指定控件当中字体的大小
    android:background
    指定该控件所使用的背景色,RGB命名法
    android:width
    指定控件的宽度
    android:height
    指定控件的高度
    android:layout_width
    指定Container组件的宽度
    android:layout_height
    指定Container组件的高度
    android:layout_weight
    View中很重要的属性,按比例划分空间
    android:padding*
    指定控件的内边距,也就是说控件当中的内容
    android:sigleLine
    如果设置为真的话,则控件的内容在同一行中进行显示
    android:scaleType
    是控制图片如何resized/moved来匹对ImageView的siz
    android:layout_centerHrizontal
    水平居中
    android:layout_centerVertical
    垂直居中
    android:layout_centerInparent
    相对于父元素完全居中
    android:layout_alignParentBottom
    贴紧父元素的下边缘
    android:layout_alignParentLeft
    贴紧父元素的左边缘
    android:layout_alignParentRight
    贴紧父元素的右边缘
    android:layout_alignParentTop
    贴紧父元素的上边缘
    android:layout_alignWithParentIfMissing
    如果对应的兄弟元素找不到的话就以父元素做参照物
    android:layout_below
    在某元素的下方
    android:layout_above
    在某元素的的上方
    android:layout_toLeftOf
    在某元素的左边
    android:layout_toRightOf
    在某元素的右边
    android:layout_alignTop
    本元素的上边缘和某元素的的上边缘对齐
    android:layout_alignLeft
    本元素的左边缘和某元素的的左边缘对齐
    android:layout_alignBottom
    本元素的下边缘和某元素的的下边缘对齐
    android:layout_alignRight
    本元素的右边缘和某元素的的右边缘对齐
    android:layout_marginBottom
    离某元素底边缘的距离
    android:layout_marginLeft
    离某元素左边缘的距离
    android:layout_marginRight
    离某元素右边缘的距离
    android:layout_marginTop
    离某元素上边缘的距离
    android:paddingLeft
    本元素内容离本元素右边缘的距离
    android:paddingRight
    本元素内容离本元素上边缘的距离
    android:hint
    设置EditText为空时输入框内的提示信息
    android:LinearLayout
    它确定了LinearLayout的方向,其值可以为vertical,表示垂直布局horizontal, 表示水平布局


    -----------------------------------------------------------------------------------------------------------------------------------------------------
    android:interpolator
    可能有很多人不理解它的用法,文档里说的也不太清楚,其实很简单,看下面:interpolator定义一个动画的变化率(the rate of change)。这使得基本的动画效果(alpha, scale, translate, rotate)得以加速,减速,重复等。用通俗的一点的话理解就是:动画的进度使用 Interpolator 控制。interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。Interpolator 是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation (float input),该方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。Android 提供了几个 Interpolator 子类,实现了不同的速度曲线,如下:
    AccelerateDecelerateInterpolator        在动画开始与介绍的地方速率改变比较慢,在中间的时侯加速
    AccelerateInterpolator        在动画开始的地方速率改变比较慢,然后开始加速
    CycleInterpolator        动画循环播放特定的次数,速率改变沿着正弦曲线
    DecelerateInterpolator        在动画开始的地方速率改变比较慢,然后开始减速
    LinearInterpolator        在动画的以均匀的速率改变
    对于 LinearInterpolator ,变化率是个常数,即 f (x) = x.
    public float getInterpolation(float input) {
    return input;
    }
    Interpolator其他的几个子类,也都是按照特定的算法,实现了对变化率。还可以定义自己的 Interpolator 子类,实现抛物线、自由落体等物理效果。
    展开全文
  • 安卓app开发-05-Android xml布局详细介绍 虽然说有 墨刀,墨客 这些图形化开发工具来做 Android 的界面设计,但是我们还是离不开要去学习做安卓原生app,学习 xml 布局还是必要的 (1)准备 首先我们要了解 ...

    安卓app开发-05-Android xml布局详细介绍

    • 虽然说有 墨刀,墨客 这些图形化开发工具来做 Android 的界面设计,但是我们还是离不开要去学习做安卓原生app,学习 xml 布局还是必要的

    (1)准备

    • 首先我们要了解 android 到底有那些布局,和每个布局类型的区别
    • 学习时最好打开 Android Studio 打开 xml 文件对应看一下
    • 配置参数的详细含义不用着急全部理解,放在文章后面,可收藏做查阅【可通过目录跳转】

    (2)学习目标

    • 学习下xml的布局文件具体写法。这一节我们要绘制如下图所示的界面
      在这里插入图片描述

    (3)线性布局 LinearLayout

    • 线性布局分两种。一种是水平布局,一种是垂直布局。下面我们根据上图举例子
    • 上图代码:
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout android:orientation="vertical"
    	android:layout_width="fill_parent" android:layout_height="fill_parent"
    	xmlns:android="http://schemas.android.com/apk/res/android">
    	<TextView android:layout_height="wrap_content" android:text="@string/note_title"
    		android:layout_width="wrap_content" android:padding="10dp"></TextView>
    	<LinearLayout android:layout_height="fill_parent"
    		android:layout_width="fill_parent" android:layout_weight="1">
    		<EditText android:id="@+id/EditText02" android:layout_width="fill_parent"
    			android:layout_height="fill_parent" android:gravity="left"
    			android:hint="@string/edithint"></EditText>
    	</LinearLayout>
    	<LinearLayout android:layout_height="fill_parent"
    		android:layout_width="fill_parent" android:layout_weight="2"
    		android:gravity="center"
    		android:orientation="horizontal">
         <ImageButton android:id="@+id/ImageButton01" android:layout_width="72dp" android:layout_height="72dp" android:src="@drawable/sketchy_paper_003" android:layout_margin="3dp"></ImageButton> <ImageButton android:id="@+id/ImageButton02" android:layout_width="72dp" android:layout_height="72dp" android:src="@drawable/sketchy_paper_004" android:layout_margin="3dp"></ImageButton> <ImageButton android:id="@+id/ImageButton03" android:layout_width="72dp" android:layout_height="72dp" android:src="@drawable/sketchy_paper_007" android:layout_margin="3dp"></ImageButton> <ImageButton android:id="@+id/ImageButton04" android:layout_width="72dp" android:layout_height="72dp" android:src="@drawable/sketchy_paper_011" android:layout_margin="3dp"></ImageButton> </LinearLayout> </LinearLayout> 
    
    • 可以看到,上图是由三部分组成。在大的LinearLayout从上而下垂直分布着三个内容:TextView,LinearLayout,LinearLayout。所以总体的 LinearLayout 是垂直布局
    • 下面我们来看水平布局
    • 其实就是上图中的最下面那个 LinearLayout。四个图标平行排列。
      android:orientation=“horizontal”

    (4)相对布局 RelativeLayout

    • 这个布局相对简单一点。一般来讲利用ADT自己拖放按钮就可以。基本上可以随意布局。如下图所示
      在这里插入图片描述
    • 上图代码:
    <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"
        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=".MainActivity" >
     
        <Button
            android:id="@+id/button1"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:text="Button" />
     
        <Button
            android:id="@+id/button2"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBaseline="@+id/button1"
            android:layout_alignBottom="@+id/button1"
            android:layout_alignParentRight="true"
            android:layout_marginRight="14dp"
            android:text="Button" />
     
        <Button
            android:id="@+id/button3"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@+id/button1"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="97dp"
            android:text="Button" />
     
        <Button
            android:id="@+id/button4"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/button1"
            android:layout_below="@+id/button3"
            android:layout_marginTop="89dp"
            android:text="Button" />
     
        <Button
            android:id="@+id/button5"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/button2"
            android:layout_alignTop="@+id/button4"
            android:text="Button" />
     
    </RelativeLayout>
    
    • layout_marginBottom是指控件边以外空下的距离,比如Button1和Button2垂直显示,将Button1中layout_marginBottom = 10dp,那么Button1与Button2之间将有10dp距离
    • 下面这两句是居左显示和居右显示
      android:layout_alignParentLeft=“true”
      android:layout_alignParentTop=“true”
    • 【提示】:相对视图应该是最有用的,具体的操作比较复杂,更多的是通过图形界面拖拉,再用代码微调

    (5)帧布局 FrameLayout

    • 这个布局很简单,而且感觉有点二二的,哈哈!就是控件一个挨一个在左上角罗列
      在这里插入图片描述
    • 上图代码:
    <?xml version="1.0" encoding="utf-8"?>
    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
     
        <Button
            android:id="@+id/button1"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />
     
        <Button
            android:id="@+id/button2"
            android:layout_width="126dp"
            android:layout_height="135dp"
            android:text="Button" />
     
        <Button
            android:id="@+id/button3"
            android:layout_width="194dp"
            android:layout_height="232dp"
            android:text="Button" />
    
    </FrameLayout>
    

    (6)绝对布局 AbsoluteLayout

    • 绝对布局比较容易使用,就是以左上方为原点建立坐标系。每个控件用layout_x和layout_y表示位置。但是据说这种布局比较刚性,不容易适配各种终端,所以要慎用!
      在这里插入图片描述
    • 上图代码:
    <?xml version="1.0" encoding="utf-8"?>
    <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
     
        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_x="44dp"
            android:layout_y="18dp"
            android:text="Button" />
     
        <Button
            android:id="@+id/button2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_x="122dp"
            android:layout_y="173dp"
            android:text="Button" />
     
        <Button
            android:id="@+id/button3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_x="36dp"
            android:layout_y="133dp"
            android:text="Button" />
     
    </AbsoluteLayout>
    
    

    (7)表格布局 TableLayout

    • TableLayout有点像一个表格或是矩阵。在布局中加入TableRow,它的属性是horizontal所以每个TableRow只能横放。它里面的每个控件的高都是一样的。下图所示,是加入了一个TableRow和里面的控件
      在这里插入图片描述
    • 上图代码:
    <?xml version="1.0" encoding="utf-8"?>
    <TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
     
        <TableRow
            android:id="@+id/tableRow1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >
     
            <Button
                android:id="@+id/button1"
                style="?android:attr/buttonStyleSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Button" />
     
            <Button
                android:id="@+id/button2"
                style="?android:attr/buttonStyleSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Button" />
     
            <Button
                android:id="@+id/button3"
                style="?android:attr/buttonStyleSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Button" />
                
            <Button
                android:id="@+id/button4"
                style="?android:attr/buttonStyleSmall"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Button" />
    
            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="TextView" />
        </TableRow>
     
    </TableLayout>
    

    xml 配置参数大全

    • 第一类:属性值为true或false
      android:layout_centerHrizontal 水平居中
      android:layout_centerVertical 垂直居中
      android:layout_centerInparent 相对于父元素完全居中
      android:layout_alignParentBottom 贴紧父元素的下边缘
      android:layout_alignParentLeft 贴紧父元素的左边缘
      android:layout_alignParentRight 贴紧父元素的右边缘
      android:layout_alignParentTop 贴紧父元素的上边缘
      android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物

    • 第二类:属性值必须为id的引用名
      android:layout_below 在某元素的下方
      android:layout_above 在某元素的的上方
      android:layout_toLeftOf 在某元素的左边
      android:layout_toRightOf 在某元素的右边
      android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
      android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐
      android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
      android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐

    • 第三类:属性值为具体的像素值,如30dip,40px
      android:layout_marginBottom 离某元素底边缘的距离
      android:layout_marginLeft 离某元素左边缘的距离
      android:layout_marginRight 离某元素右边缘的距离
      android:layout_marginTop 离某元素上边缘的距离
      EditText的android:hint 设置EditText为空时输入框内的提示信息。
      android:gravity 
      android:gravity属性是对该view 内容的限定.比如一个button 上面的text. 你可以设置该text 在view的靠左,靠右等位置.以button为例,android:gravity="right"则button上面的文字靠右
      android:layout_gravity
      android:layout_gravity是用来设置该view相对与起父view 的位置.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为例,android:layout_gravity="right"则button靠右
      android:scaleType:
      android:scaleType是控制图片如何resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别:
      CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示
      CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽)
      CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽
      FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示
      FIT_END / fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置
      FIT_START / fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置
      FIT_XY / fitXY 把图片不按比例扩大/缩小到View的大小显示
      MATRIX / matrix 用矩阵来绘制,动态缩小放大图片来显示。
      ** 要注意一点,Drawable文件夹里面的图片命名是不能大写的。


    android:id 为控件指定相应的ID
    android:text 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串
    android:gravity 指定View组件的对齐方式,比如说居中,居右等位置 这里指的是控件中的文本位置并不是控件本身
    android:layout_gravity 指定Container组件的对齐方式.比如一个button 在linearlayout里,你想把该button放在靠左、靠右等位置就可以通过该属性设置.以button为 例,android:layout_gravity="right"则button靠右
    android:textSize 指定控件当中字体的大小
    android:background 指定该控件所使用的背景色,RGB命名法
    android:width 指定控件的宽度
    android:height 指定控件的高度

    android:layout_width 指定Container组件的宽度
    android:layout_height 指定Container组件的高度
    android:layout_weight View中很重要的属性,按比例划分空间
    android:padding* 指定控件的内边距,也就是说控件当中的内容
    android:sigleLine 如果设置为真的话,则控件的内容在同一行中进行显示
    android:scaleType 是控制图片如何resized/moved来匹对ImageView的siz
    android:layout_centerHrizontal 水平居中
    android:layout_centerVertical 垂直居中
    android:layout_centerInparent 相对于父元素完全居中
    android:layout_alignParentBottom 贴紧父元素的下边缘

    android:layout_alignParentLeft 贴紧父元素的左边缘
    android:layout_alignParentRight 贴紧父元素的右边缘
    android:layout_alignParentTop 贴紧父元素的上边缘
    android:layout_alignWithParentIfMissing 如果对应的兄弟元素找不到的话就以父元素做参照物
    android:layout_below 在某元素的下方
    android:layout_above 在某元素的的上方
    android:layout_toLeftOf 在某元素的左边
    android:layout_toRightOf 在某元素的右边
    android:layout_alignTop 本元素的上边缘和某元素的的上边缘对齐
    android:layout_alignLeft 本元素的左边缘和某元素的的左边缘对齐

    android:layout_alignBottom 本元素的下边缘和某元素的的下边缘对齐
    android:layout_alignRight 本元素的右边缘和某元素的的右边缘对齐
    android:layout_marginBottom 离某元素底边缘的距离
    android:layout_marginLeft 离某元素左边缘的距离
    android:layout_marginRight 离某元素右边缘的距离
    android:layout_marginTop 离某元素上边缘的距离
    android:paddingLeft 本元素内容离本元素右边缘的距离
    android:paddingRight 本元素内容离本元素上边缘的距离
    android:hint 设置EditText为空时输入框内的提示信息
    android:LinearLayout 它确定了LinearLayout的方向,其值可以为vertical,表示垂直布局horizontal, 表示水平布局


    android:interpolator
    可能有很多人不理解它的用法,文档里说的也不太清楚,其实很简单,看下面:interpolator定义一个动画的变化率(the rate of change)。这使得基本的动画效果(alpha, scale, translate, rotate)得以加速,减速,重复等。用通俗的一点的话理解就是:动画的进度使用 Interpolator 控制。interpolator 定义了动画的变化速度,可以实现匀速、正加速、负加速、无规则变加速等。Interpolator 是基类,封装了所有 Interpolator 的共同方法,它只有一个方法,即 getInterpolation (float input),该方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。Android 提供了几个 Interpolator 子类,实现了不同的速度曲线,如下:
    AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时侯加速
    AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
    CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
    DecelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始减速
    LinearInterpolator 在动画的以均匀的速率改变
    对于 LinearInterpolator ,变化率是个常数,即 f (x) = x.
    public float getInterpolation(float input) {
    return input;
    }
    Interpolator其他的几个子类,也都是按照特定的算法,实现了对变化率。还可以定义自己的 Interpolator 子类,实现抛物线、自由落体等物理效果

    更多文章链接: 安卓app开发


    - 本笔记不允许任何个人和组织转载
    展开全文
  • Android XML布局文件解析过程源码解析

    千次阅读 2016-08-22 09:47:52
    `mLayoutInflater.inflate(layoutResID, ...这行代码的作用是将我们的activity_main.xml填充到mContentParent去。详见:[setContentView源码解析]。那么,这行代码怎么就将xml文件转换成了View或者ViewGroup了呢?

    我们知道,在Activity#setContentView()中会调用PhoneWindow#setContentView()。而在PhoneWindow#setContentView()中有这么一句mLayoutInflater.inflate(layoutResID, mContentParent)。这行代码的作用是将我们的activity_main.xml填充到mContentParent中去。详见:setContentView源码解析。在写adapter的时候,也经常写mInflater.inflate(layoutResID, parent,false)。那么,这行代码怎么就将xml文件转换成了View或者ViewGroup了呢?

    获取LayoutInflater对象无非以下两种方式:

    1. LayoutInflater.from(Context context);
    2. LayoutInflater LayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    其实这俩是同一种方式,首先看下LayoutInflater#from()

    源码位置:frameworks/base/core/java/android/view/LayoutInflater.java

    LayoutInflater#from()

        public static LayoutInflater from(Context context) {
            LayoutInflater LayoutInflater =
                    (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            if (LayoutInflater == null) {
                throw new AssertionError("LayoutInflater not found.");
            }
            return LayoutInflater;
        }

    第一种获取LayoutInflater对象的方式,不过就是对第二种方式的一个简单封装。实际上还是一回事。Context的实现类是ContextImpl,跟进。

    源码位置:frameworks/base/core/java/android/app/ContextImpl.java

    ContextImpl#getSystemService()

        @Override
        public Object getSystemService(String name) {
            return SystemServiceRegistry.getSystemService(this, name);
        }

    跟进。

    源码位置:frameworks/base/core/java/android/app/SystemServiceRegistry.java

    SystemServiceRegistry#getSystemService()

        public static Object getSystemService(ContextImpl ctx, String name) {
            ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);
            return fetcher != null ? fetcher.getService(ctx) : null;
        }

    直接从全局变量SYSTEM_SERVICE_FETCHERS中依据名字就get到了fetcher,之后依据fetcher直接get到了LayoutInflater对象。大写的懵B~原来啊,在SystemServiceRegistry中有个静态代码块,先看下这部分。

        static {
            ...
            registerService(Context.LAYOUT_INFLATER_SERVICE, LayoutInflater.class,
                    new CachedServiceFetcher<LayoutInflater>() {
                @Override
                public LayoutInflater createService(ContextImpl ctx) {
                    return new PhoneLayoutInflater(ctx.getOuterContext());
            }});
            ...
        }
    
        private static <T> void registerService(String serviceName, Class<T> serviceClass,
                ServiceFetcher<T> serviceFetcher) {
            SYSTEM_SERVICE_NAMES.put(serviceClass, serviceName);
            SYSTEM_SERVICE_FETCHERS.put(serviceName, serviceFetcher);
        }
    
        static abstract class CachedServiceFetcher<T> implements ServiceFetcher<T> {
            private final int mCacheIndex;
    
            public CachedServiceFetcher() {
                mCacheIndex = sServiceCacheSize++;
            }
    
            @Override
            @SuppressWarnings("unchecked")
            public final T getService(ContextImpl ctx) {
                final Object[] cache = ctx.mServiceCache;
                synchronized (cache) {
                    // Fetch or create the service.
                    Object service = cache[mCacheIndex];
                    if (service == null) {
                        service = createService(ctx);
                        cache[mCacheIndex] = service;
                    }
                    return (T)service;
                }
            }
    
            public abstract T createService(ContextImpl ctx);
        }

    这里连续贴了两个方法和一个抽象内部类CachedServiceFetcher。由于在抽象方法CachedServiceFetcher#createService()的具体实现中返回的是PhoneLayoutInflater,所以后文中使用的一直是PhoneLayoutInflater的对象。获取LayoutInflater对象(其实是其子类PhoneLayoutInflater对象)之后,调用LayoutInflater#inflate()。跟进。

    源码位置:frameworks/base/core/java/android/view/LayoutInflater.java

    LayoutInflater#inflate()

        public View inflate(@LayoutRes int resource, @Nullable ViewGroup root) {
            return inflate(resource, root, root != null);
        }

    这里以setContentView中的mLayoutInflater.inflate(layoutResID, mContentParent)为例,顺带也会讲解adapter中mInflater.inflate(layoutResID,null)这种情况。也就是root参数为null和不为null两种情况。root==null,则第三个参数为false.root!=null,则第三个参数为true。跟进。

    LayoutInflater#inflate()

        public View inflate(@LayoutRes int resource, @Nullable ViewGroup root, boolean attachToRoot) {
            final Resources res = getContext().getResources();
            final XmlResourceParser parser = res.getLayout(resource);
            try {
                return inflate(parser, root, attachToRoot);
            } finally {
                parser.close();
            }
        }

    跟进。

    LayoutInflater#inflate()

        public View inflate(XmlPullParser parser, @Nullable ViewGroup root, boolean attachToRoot) {
            synchronized (mConstructorArgs) {
                ...
                View result = root;
                try {
                    ...
                    // 获取根节点的字符串,例如LinearLayout
                    final String name = parser.getName();
                    // 根节点merge开头
                    if (TAG_MERGE.equals(name)) {
                        ...
                    } else {
                        // 创建根视图View
                        final View temp = createViewFromTag(root, name, inflaterContext, attrs);
                        ViewGroup.LayoutParams params = null;
                        if (root != null) {
                            // 获取LayoutParams
                            params = root.generateLayoutParams(attrs);
                            if (!attachToRoot) {
                                // 应用LayoutParams到根节点View
                                temp.setLayoutParams(params);
                            }
                        }
                        // 遍历解析子View,并添加到根节点temp中
                        rInflateChildren(parser, temp, attrs, true);
                        // root不为空,直接将根节点View添加到root中
                        if (root != null && attachToRoot) {
                            root.addView(temp, params);
                        }
                        // root等于null,直接返回根节点temp
                        if (root == null || !attachToRoot) {
                            result = temp;
                        }
                    }
                }catch (Exception e) {
                    ...
                }    
                return result;
            }
        }                       

    上面每一步都有注释,下面重点看下生成根节点View的createViewFromTag()和遍历生成子View的rInflateChildren()方法。

    LayoutInflater#createViewFromTag()

        private View createViewFromTag(View parent, String name, Context context, AttributeSet attrs) {
            return createViewFromTag(parent, name, context, attrs, false);
        }
    
        View createViewFromTag(View parent, String name, Context context, AttributeSet attrs,
                boolean ignoreThemeAttr) {
            ...
            if (-1 == name.indexOf('.')) {
                view = onCreateView(parent, name, attrs);
            } else {
                view = createView(name, null, attrs);
            }
            ...
            return view;
        }

    跟进。

    LayoutInflater#createView()

        public final View createView(String name, String prefix, AttributeSet attrs)
                throws ClassNotFoundException, InflateException {
            Constructor<? extends View> constructor = sConstructorMap.get(name);
            Class<? extends View> clazz = null;
            try {
                if (constructor == null) {
                    clazz = mContext.getClassLoader().loadClass(
                            prefix != null ? (prefix + name) : name).asSubclass(View.class);
                    ...
                    constructor = clazz.getConstructor(mConstructorSignature);
                    constructor.setAccessible(true);
                    sConstructorMap.put(name, constructor);
                } else {
                    ...
                }
                final View view = constructor.newInstance(args);
                return view;
            } catch (Exception e) {
                ...
            }   
        }    

    sConstructorMap是个HashMap<String, Constructor<? extends View>>对象。首先依据根节点的名字,例如LinearLayout去查找缓存的构造器,如果是第一次执行,肯定返回null。如果返回为null,则通过反射出构造方法,并强制设置可访问,之后存进sConstructorMap中。如果缓存中有构造器,那么直接取出。最后调用newInstance反射出根节点View实例。得到根节点View实例之后,接着设置属性,最后调用rInflateChildren()遍历创建子View。跟进。

    LayoutInflater#rInflateChildren()

        final void rInflateChildren(XmlPullParser parser, View parent, AttributeSet attrs,
                boolean finishInflate) throws XmlPullParserException, IOException {
            rInflate(parser, parent, parent.getContext(), attrs, finishInflate);
        }

    parent参数是根节点View。这里只是简单转发给rInflate()方法处理。跟进。

    LayoutInflater#rInflateChildren()

        void rInflate(XmlPullParser parser, View parent, Context context,
                AttributeSet attrs, boolean finishInflate) throws XmlPullParserException, IOException {
            final int depth = parser.getDepth();
            int type;
    
            while (((type = parser.next()) != XmlPullParser.END_TAG ||
                    parser.getDepth() > depth) && type != XmlPullParser.END_DOCUMENT) {
    
                if (type != XmlPullParser.START_TAG) {
                    continue;
                }
                final String name = parser.getName();
                if (TAG_REQUEST_FOCUS.equals(name)) {
                    ...
                }
                ...
                } else {
                    final View view = createViewFromTag(parent, name, context, attrs);
                    final ViewGroup viewGroup = (ViewGroup) parent;
                    final ViewGroup.LayoutParams params = viewGroup.generateLayoutParams(attrs);
                    rInflateChildren(parser, view, attrs, true);
                    viewGroup.addView(view, params);
                }
            }
            if (finishInflate) {
                parent.onFinishInflate();
            }
        }

    遍历体现在While循环上,name为子节点View的名称,例如:TextView,RelativeLayout等。几个以tag、include等开头的子节点走最上面几个if的逻辑,我们的重点在于寻常View走的else逻辑。可以看到:首先,和创建根节点View调用同一个方法createViewFromTag()创建子View,紧接着设置子View的参数,然后调用递归调用rInflateChildren()方法再去测量子节点的所有View,最后才将子节点添加到父布局,这个父布局可能是根节点,也可能是某个子节点。遍历结束之后,所有子View也添加到布局当中并设置好相应的布局参数。

    至此,LayoutInflater.from().inflate()源码解析结束~

    更多Framework源码解析,请移步 Framework源码解析系列[目录]

    展开全文
  • 利用XML布局自定义列表样式

    千次阅读 2015-01-29 23:43:22
    利用XML布局自定义列表样式 之前在学习Spinner 的时候就有这样的困惑,我们是不是可以自己定义列表的样式呢。因为我们使用系统自定义的样式的话有可能和我们的布局格格不入,显示的字样有可能很大很大。今天我们...
  • 上一篇博客分析了XML布局怎么加载到Activity上,不了解的可以参考从setContentView方法分析Android加载布局流程上一篇博客只是分析了怎么讲XML布局添加到 Activity 的DecorView根布局上,最后是通过如下代码将资源...
  • AndroidListView的每个Item以资源文件XML形式显示数据进行布局
  • 在EclipseAndroid程序项目目录结构下的res文件夹新建drawable文件夹,并在drawable文件夹下新建各类的xml样式文件,供layout文件夹下的xml布局文件引用,以满足对程序界面的需求开发。如图1和图2是drawable下xml...
  • duilib——从XML文件加载界面

    千次阅读 2017-06-03 18:22:35
    Duilib支持xml界面布局文件,使得界面设计与逻辑处理相分离。 需要以下几个步骤: 1、创建并初始化CPaintManagerUI对象。...使用UIDesigner工具编写xml界面布局文件。 3、调用CPaintManagerUI的AttachDia...
  • 可自定义垂直循环滚动布局

    千次阅读 2017-11-01 17:12:42
    [Android]可自定义垂直循环滚动布局 @Author GQ 2017年11月01日 垂直滚动广告字幕什么的都是一行的,这个控件可以自定义布局,也就是Adapter 对于滚动多行item循环效果, 通过多个VerticalBannerView笨办法也...
  • Android界面布局中使用GIF动画

    千次阅读 2013-07-24 16:49:23
    在res目录下新建anim动画文件夹,新建一个animation.xml xmlns:android="http://schemas.android.com/apk/res/android"> <!-- duration为每张逐帧播放间隔, oneshot 为false 代
  • 1在服务器的WebContent新建一个XML文件存储数据名为girlsxml这就是服务器端发送给客户端的XML文件 2新建一个XmlThreadjava类继承Thread用来向服务器请求并下载XML文件完成相关的XML文件解析操作 3新建一个Girljava...
  • 动画Animation-list帧布局文件,一个是按顺序显示动画文件存放在res/drawable目录下 如果显示的图像要求小于装载图像的视图(例如,背景图小于View区域),可以考虑使用嵌入图像资源。嵌入图像资源是XML格式的文件,...
  • JAVASCRIPT中使用DOM操作XML文档

    千次阅读 2006-12-27 12:05:00
    script language="JavaScript">var doc = new ActiveXObject(... //ie5.5+,CreateObject("Microsoft.XMLDOM") //加载文档//doc.load("b.xml");//创建文件头var p = doc.createProcessingInstruction("xml
  • 使用jdom生成xml以及读取修改xml

    千次阅读 2013-05-09 13:41:23
    第一篇博客,不知道怎么布局,囧。 需要jar外部jar——jdom.2.0.4.jar 下载地址:http://download.csdn.net/download/liu119361940/5348593 好了直接上代码 package com.vision.backktv.xml; import ...
  • Android的资源是指非代码部分,如图片、音频、视频、字符等资源...布局类型文件一般都放在res文件夹下,如:anim,drawable,layout,values,xml,raw,menu等等,这些资源都可以通过R资源类直接访问。assets的资
  • 使用原始XML资源

    千次阅读 2013-06-05 22:28:12
    随时随地阅读更多技术...如果项目中使用到了一些原始的XML文件,那么,我们可以定义一些XML 文件供工程使用。XML文件定义在工程的res\xml目录下,通过Resource.getXML()方法访问。 获得原始XML文件的基本思路是,...
  • 文章目录引入框架引入资源URI引入支持的类型初始化使用XML布局文件)中使用简单加载网络图片SimpleDraweeView配置示例各种使用详解Image Pipeline 引入框架 官方文档引入版本 dependencies { // 在 API < 14 ...
  • java从XML中读取数据源配置

    千次阅读 2011-03-23 21:52:00
    1、使用java.util.*的Properties类读取文件  工程布局如图 其中conf.txt和conf.xml为配置文件.内容如 conf.txt文件内容: serverport=8899 dbip=127.0.0.1 dbport = 1433 conf.xml文件内容:其中格式必须...
  • android中xml文件的作用及解释

    千次阅读 2016-10-06 19:57:31
    在Android也会随处可见XML文件,包括一个android项目不可缺少的AndroidManifest.xml清单文件,res资源文件目录下的anim/drawable/layout/menu/values中等,目录截图如下。其中清单文件内容最多最复杂,完全可以...
  • Dino Esposito本文假定您熟悉 XML 和 .NET 框架 下载本文的代码:Real-WorldXML.exe(120KB) 本页内容 从 MSXML 到 .NET XML
  • 很简单,废话不多说,直接贴代码: xml布局: android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientati
  • 性能优化之布局优化篇二 使用标签

    千次阅读 2016-09-05 15:02:50
    1.一个布局文件需要被添加到另一个父布局中(可以在xml中使用添加,或在java代码中使用inflate()添加)时,可以使用merge作为该布局的根节点。这样,当被添加进父布局时根节点会自动被忽略,所有的子节点直接被添加...
  • 布局的重复使用

    千次阅读 2015-11-02 19:41:52
    首先,必须明白自己要做什么样子的重复布局,以图1为例,创建一个自定义布局:(图1)。有三个组件,一个TextView(设置你想输入的信息,如姓名等),一个ImageView(用来显示头像),最后是一个EditText(显示输入的文字);...
  • 常见的是在res/layout/activity_xxx.xml文件实现Android界面布局,也可以在JAVA代码实现布局,这种方法也是比较灵活,也比较常用。可以使用 LinearLayout.addView() 往一个Layout添加控件。下面要在一个空的...
  • xml解析

    千次阅读 2019-04-04 22:48:10
    xml:可扩展标记语言,类似...用来做配置文件,在Android当中的布局文件和清单文件 语法 文档声明 声明必须在第一行,最简单的声明 <?xml version="1.0"?> encoding属性用于指定编码格式 <?xml version=...
  • 安卓XML和JSON

    千次阅读 2019-04-10 20:10:16
    XML和JSON其实还是比较常见了,JAVASE和JAVAEE的学习或多或少会...在Android平台内部很多地方使用XML存储: 比如之前的SharedPreferences的存储就是使用XML文件,持久化存储的同时又兼具轻量的特性。(h...
  • 本篇博客主要介绍的是如何使用RecyclerView实现图片水平方向自动循环(跑马灯效果) 效果图:  思路: 1.准备m张图片 1.使用Recyclerview实现,返回无数个(实际Interge.MAXVALUE)item,第n个item显示第n%m张...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 40,748
精华内容 16,299
关键字:

xml中的布局循环使用