界面设计:
相关类:
视图:
简单控件:
高级控件:
视图组(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,框架布局)不经常使用,经常使用其子类
子类:TextSwitcher/ImageSwitcher/DatePicker/ScrollView/TabHost
线性布局:最常用的布局
(垂直排列、水平排列)
android:orientation=”vertical/horizontal”
android:layout_weight=”X”
相对布局:(省略布局代码)
网格布局实现:
布局的嵌套:
//面对复杂的布局结构,嵌套的应用是必要的啦~
屏幕旋转的问题:(Landscape:横屏 Portrait:竖屏)
//获取当前的设备朝向状态
this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT
设备的三种状态:
注:Activity中setContentView()可以重新加载布局文件。