Android笔记之界面布局

界面设计:

相关类:

  • Activity
  • Fragment
  • View
  • ViewGroup
  • Layout

视图:

简单控件:

  • Button
  • ImageButton
  • ToggleButton
  • TextView
  • EditText
  • RadioButton
  • CheckBox
  • ImageView
  • ProgressBar
  • SeekBar
  • RatingBar

高级控件:

  • AutoCompleteTextView
  • Spinner
  • ListView
  • GridView
  • Gallery

视图组(ViewGroup):

多个视图组成的复杂视图,是View的子类,是高级控件和布局的父类。

界面构建:

设计工具:WYSIWYG(所见即所得)可视化界面设计工具。

控件时间处理:

事件源:各个控件。

事件:EG:KeyEvent、MotionEvent(封装成一个类)特殊:Button点击事件没有封装

事件处理者:实现XXXListenter接口-->事件监听器。

监听器:

活动作为事件的监听器:

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //通过id获得OK按钮对象
        Button btnOK = (Button) findViewById(R.id.button);

        //注册事件监听器
        btnOK.setOnClickListener(this);
    }

    /*
     *  实现View.OnClickListener接口方法
     */
    @Override
    public void onClick(View view) {
        TextView text = (TextView) findViewById(R.id.textView);
        text.setText("HelloWorld");
    }
}

内部类事件监听器:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //通过id获得OK按钮对象
        Button btnOK = (Button) findViewById(R.id.button);

        //注册事件监听器
        btnOK.setOnClickListener(new ButtonOKOnClickListener());
    }

    class ButtonOKOnClickListener implements View.OnClickListener {
        /*
         *  实现View.OnClickListener接口方法
         */
        @Override
        public void onClick(View view) {
            TextView text = (TextView) findViewById(R.id.textView);
            text.setText("HelloWorld");
        }
    }
}

匿名内部类事件监听器:

public class MainActivity extends AppCompatActivity {

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

        //通过id获得OK按钮对象
        Button btnOK = (Button) findViewById(R.id.button);

        //注册事件监听器
        btnOK.setOnClickListener(new View.OnClickListener() {

            /*
             *  实现View.OnClickListener接口方法
             */
            @Override
            public void onClick(View v) {
                TextView text = (TextView) findViewById(R.id.textView);
                text.setText("HelloWorld");
            }
        });
    }
}

屏幕事件的处理:(触摸事件&&键盘事件)

//触摸事件:重写活动的方法public  boolean  onTouchEvent(MotionEvent  event)
//在屏幕上显示当前的动作和所在的位置
public class MainActivity extends AppCompatActivity {

    //两个TextView分别显示:动作、位置
    private TextView mAction;
    private TextView mPostion;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mAction = (TextView) findViewById(R.id.action);
        mPostion = (TextView) findViewById(R.id.postion);

    }

    //此方法(onTouchEvent())必须重写
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //动作Action为常量
        int action = event.getAction();

        switch (action) {
            case MotionEvent.ACTION_UP:
                mAction.setText("手指抬起");
                break;
            case MotionEvent.ACTION_DOWN:
                mAction.setText("手指按下");
                break;
            case MotionEvent.ACTION_MOVE:
                mAction.setText("手指移动");
        }

        //获取X轴、Y轴坐标
        float X = event.getX();
        float Y = event.getY();

        mPostion.setText("位置  =  (" + X + "," + Y + ")");
        //返回true为执行过此方法,否则为false
        return true;
    }
}

键盘事件:

//keyCode 为键的编码;KeyEvent为键盘的事件
Boolean onKeyUp (int keyCode ,KeyEvent event)
Boolean onKeyDown (int keyCode ,KeyEvent event)
Boolean onKeyLongPress (int keyCode ,KeyEvent event)

图片的透明度和声音按键的结合Demo:

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "keyeventsample";
    private ImageView mImage;
    private TextView mAlphavalueText;
    private int mAlphavalue; //全局变量,当前图片透明度:(0,255)
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        mImage = (ImageView) findViewById(R.id.image);
        mAlphavalueText = (TextView) findViewById(R.id.alphavalue);
        mAlphavalue = 100;                     //透明度初始值100
        mImage.setImageAlpha(mAlphavalue);            //设置图片透明度
        mAlphavalueText.setText("Alpha  =  " + mAlphavalue * 100 / 255 + "%");
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //监听所有键盘事件
        switch (keyCode) {
            case KeyEvent.KEYCODE_VOLUME_UP://放大声音键
                mAlphavalue += 20;
                break;
            case KeyEvent.KEYCODE_VOLUME_DOWN://缩小声音键
                mAlphavalue -= 20;
                break;
        }

        if (mAlphavalue >= 255) {
            mAlphavalue = 255;
        }

        if (mAlphavalue <= 0) {
            mAlphavalue = 0;
        }
        mImage.setImageAlpha(mAlphavalue);
        mAlphavalueText.setText("Alpha  =  " + mAlphavalue * 100 / 255 + "%");
        
        return super.onKeyDown(keyCode, event);
    }
}

目的:合理利用屏幕空间、适配不同的屏幕

布局类是一种容器,继承ViewGroup类

六种基本布局类:

  • FrameLayout
  • LinearLayout
  • AbsoluteLayout
  • RelativeLayout
  • TableLayout
  • GridLayout

帧布局:(FrameLayout,框架布局)不经常使用,经常使用其子类

子类:TextSwitcher/ImageSwitcher/DatePicker/ScrollView/TabHost

线性布局:最常用的布局

(垂直排列、水平排列)
android:orientation=”vertical/horizontal”
android:layout_weight=”X”

相对布局:(省略布局代码)

  • padding:(内边距)
  • margin:(外边距)

网格布局实现:



    
    

布局的嵌套:




    

    

    

    

//面对复杂的布局结构,嵌套的应用是必要的啦~

屏幕旋转的问题:(Landscape:横屏 Portrait:竖屏)

//获取当前的设备朝向状态
this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT

设备的三种状态:

  • Configuration.ORIENTATION_PORTRAIT //常量,设备处于竖屏状态
  • Configuration.ORIENTATION_LANDSCAPE //常量,设备处于横屏状态
  • Configuration.ORIENTATION_UNDEFINED //常量,设备处于未知状态

注:Activity中setContentView()可以重新加载布局文件。

你可能感兴趣的:(Android学习)