文章目录
Android 布局控制
1. 使用XML控制Android的UI界面
XML布局文件保存至res/layout
目录下,且文件名要符合Java变量的命名规则。
控制UI界面通常由两步:
- 编写XML文件
- 在Activity
Oncreate()
中设置界面:setContentView(R.layout.activity_main);
2. 在Java代码中控制Android的UI界面
可以不通过XML文件,完全通过Java代码来控制。
基本步骤:
- 创建布局管理器
- 创建组件(
View
的子类)及设置其属性 - 将组件添加到布局管理器(
<布局实例>.setView(<组件>)
)
2.1 举例
package com.mingrisoft;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.graphics.Color;
import android.util.Log;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
public TextView text1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FrameLayout frameLayout = new FrameLayout(this); // 创建帧布局管理器
frameLayout.setBackgroundResource(R.mipmap.bg); //设置背景
setContentView(frameLayout); // 设置在Activity中显示frameLayout
text1 = new TextView(this);
text1.setText("开始游戏"); //设置显示文字
text1.setTextSize(TypedValue.COMPLEX_UNIT_SP, 18); // 设置文字大小,单位为SP(缩放像素)
text1.setTextColor(Color.rgb(17, 85, 114)); // 设置文字的颜色
FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT); //创建保存布局参数的对象
params.gravity = Gravity.CENTER; //设置居中显示
text1.setLayoutParams(params); //设置布局参数
text1.setOnClickListener(new OnClickListener() { // 为text1添加单击事件监听器
@Override
public void onClick(View v) {
new AlertDialog.Builder(MainActivity.this).setTitle("系统提示") // 设置对话框的标题
.setMessage("游戏有风险,进入需谨慎,真的要进入吗?") // 设置对话框的显示内容
.setPositiveButton("确定", // 为确定按钮添加单击事件
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.i("桌面台球", "进入游戏"); // 输出消息日志
}
}).setNegativeButton("退出", // 为取消按钮添加单击事件
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Log.i("桌面台球", "退出游戏"); // 输出消息日志
finish(); // 结束游戏
}
}).show(); // 显示对话框
}
});
frameLayout.addView(text1); // 将text1添加到布局管理器中
}
}
3. 使用XML和Java代码混合控制UI界面
-
XML文件用以配置简单、变化不大的组件。
-
Java代码用以配置复杂、变化大的组件。
4. 开发自定义的View
自定义的view
用来满足丰富的开发需求。
基本步骤:
- 编写自定义View类,继承自
View
类 - 重写构造方法及
onDraw()
方法
使用方式:
- 在Activity对应的XML布局文件中添加一个
FrameLayout
,并设置其属性(ID、宽高) - 创建并实例化自定义
View
- 将自定义View添加到
FrameLayout
中
4.1 举例
一个随跟随手指的兔子
-
自定义View
package mingrisoft.com; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.view.View; /** * Created by lilei on 2016/1/7. */ public class RabbitView extends View { public float bitmapX; // 兔子显示位置的X坐标 public float bitmapY; // 兔子显示位置的Y坐标 public RabbitView(Context context) { // 重写构造方法 super(context); bitmapX = 290; // 设置兔子的默认显示位置的X坐标 bitmapY = 130; // 设置兔子的默认显示位置的Y坐标 } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); // 创建并实例化Paint的对象 Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), R.mipmap.rabbit); // 根据图片生成位图对象 canvas.drawBitmap(bitmap, bitmapX, bitmapY, paint); // 绘制小兔子 if (bitmap.isRecycled()) { // 判断图片是否回收 bitmap.recycle(); // 强制回收图片 } } }
-
在XML文件中添加
FrameLayout
<?xml version="1.0" encoding="utf-8"?> <FrameLayout 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:background="@mipmap/background" android:id="@+id/mylayout" 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="com.mingrisoft.MainActivity" > </FrameLayout>
-
使用自定义View
package mingrisoft.com; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.FrameLayout; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); FrameLayout frameLayout=(FrameLayout)findViewById(R.id.mylayout); // 获取帧布局管理器 final RabbitView rabbit=new RabbitView(this); // 创建并实例化RabbitView类 //为小兔子添加触摸事件监听 rabbit.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { rabbit.bitmapX=event.getX(); // 设置小兔子显示位置的X坐标 rabbit.bitmapY=event.getY(); // 设置小兔子显示位置的Y坐标 rabbit.invalidate(); //重绘rabbit组件 return true; } }); frameLayout.addView(rabbit); //将rabbit添加到布局管理器中 } }