Android看书笔记之界面编程与布局

界面设计:

相关类:ActivityFragmentViewViewGroupLayout

视图:

简单控件:ButtonImageButtonToggleButtonTextViewEditTextRadioButtonCheckBoxImageViewProgressBarSeekBarRatingBar等。

高级控件:AutoCompleteTextViewSpinnerListViewGridViewGallery等。

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

界面构建:

设计工具:WYSIWYG可视化界面设计工具。

控件时间处理:

事件源:各个控件。

事件:EGKeyEventMotionEvent(封装成一个类)特殊: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) {

        int action = event.getAction();//动作Action为常量

        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 + ")");

        return true; //返回true为执行过此方法,否则为false

    }

}

键盘事件:

//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:(外边距)

网格布局实现:

<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="wrap_content"

    android:layout_height="wrap_content"

    android:layout_gravity="center_horizontal"

    android:columnCount="4"

    android:orientation="horizontal"

    android:rowCount="5">

    <Button

        android:id="@+id/zero"

        android:layout_columnSpan="2"

        android:layout_gravity="fill"

        android:text="0" />

    <Button

        android:id="@+id/point"

        android:text="." />                                 

    <Button

        android:id="@+id/plus"

        android:layout_gravity="fill"

        android:layout_rowSpan="2"

        android:text="+" />

    <Button

        android:id="@+id/equal"

        android:layout_columnSpan="3"

        android:layout_gravity="fill"

        android:text="=" />

</GridLayout>

布局的嵌套:

<?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"

    android:orientation="vertical">

    <TextView

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:gravity="center"

        android:text="@string/title"

        android:textSize="20sp" />

    <include

        android:id="@+id/include01"

        layout="@layout/layoutcase1" />

    <include

        android:id="@+id/include02"

        layout="@layout/layoutcase2" />

    <include

        android:id="@+id/include03"

        layout="@layout/layoutcase3" />

</LinearLayout>

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

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

//获取当前的设备朝向状态

this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT

设备的三种状态:

Configuration.ORIENTATION_PORTRAIT //常量,设备处于竖屏状态

Configuration.ORIENTATION_LANDSCAPE //常量,设备处于横屏状态

Configuration.ORIENTATION_UNDEFINED //常量,设备处于未知状态

注:ActivitysetContentView()可以重新加载布局文件。

猜你喜欢

转载自blog.csdn.net/qq_36347817/article/details/79941105
今日推荐