1. 使用xml控制(简单但不灵活)
把页面布局代码写在xml()当中将布局和java逻辑分离,程序结构更加明了
I. 编写res/layout/~.xml
文件
<?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/bg"
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" >
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="18sp"
android:textColor="#115572"
android:text="@string/start" />
</FrameLayout>
- layout_gravity设置居中
- text="@string/start"是定义的字符串资源,start是strings.xml里面定义的name属性,按这种格式书写即可
II. java代码设置显示
setContentView(R.layout.activity_main);
- activity_main是xml文件名字
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
-
左图为背景图
2. 使用java代码控制(灵活但逻辑复杂)
完全通过java代码控制界面,不用编写xml文件,具体流程:
I. 创建MainActivity类,继承自AppCompatActivity
public class MainActivity extends AppCompatActivity {}
II. 创建布局管理器
FrameLayout frameLayout = new FrameLayout(this); // 创建帧布局管理器
frameLayout.setBackgroundResource(R.mipmap.bg); //设置背景
setContentView(frameLayout); // 设置在Activity中显示frameLayout
III. 创建其他需要显示的组件并添加到布局管理器
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); //设置布局参数
frameLayout.addView(text1); // 将text1添加到布局管理器中
IV. 添加其他事件(了解)
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(); // 显示对话框
}
});
全部代码
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代码混合控制(推荐)
基础布局以及简单组件利用xml编写,复杂组件和变动大的布局用java实现
I. 编写xml布局文件完成基础布局
<?xml version="1.0" encoding="utf-8"?>
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout"
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"
android:orientation="horizontal"
android:rowCount="3"
android:columnCount="4"
tools:context="com.mingrisoft.MainActivity">
</GridLayout>
II. 编写java文件添加相应组件
public class MainActivity extends AppCompatActivity {
private ImageView[] img=new ImageView[12]; //声明一个保存ImageView组件的数组
private int[] imagePath=new int[]{
R.mipmap.img01,R.mipmap.img02,R.mipmap.img03,R.mipmap.img04,
R.mipmap.img05,R.mipmap.img06,R.mipmap.img07,R.mipmap.img08,
R.mipmap.img09,R.mipmap.img10,R.mipmap.img11,R.mipmap.img12
}; //声明并初始化一个保存访问图片的数组
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
GridLayout layout=(GridLayout)findViewById(R.id.layout);//获取XML文件中定义的线性布局管理器
for(int i=0;i<imagePath.length;i++){
img[i]=new ImageView(MainActivity.this); //创建一个ImageView组件
img[i].setImageResource(imagePath[i]); //为ImageView组件指定要显示的图片
img[i].setPadding(2, 2,2, 2); //设置ImageView组件的内边距
ViewGroup.LayoutParams params=new ViewGroup.LayoutParams(116,68);//设置图片的宽度和高度
img[i].setLayoutParams(params); //为ImageView组件设置布局参数
layout.addView(img[i]); //将ImageView组件添加到布局管理器中
}
}
}
-
素材(
提取码:3gv1
)
4. 开发自定义View
I. xml文件创建布局管理
<?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>
II. java代码创建自定义的VIew
public class RabbitView extends View {
public float bitmapX; // 兔子显示位置的X坐标
public float bitmapY; // 兔子显示位置的Y坐标
}
III. 编写构造方法
public RabbitView(Context context) { // 重写构造方法
super(context);
bitmapX = 290; // 设置兔子的默认显示位置的X坐标
bitmapY = 130; // 设置兔子的默认显示位置的Y坐标
}
IV. 重写ondraw方法
@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(); // 强制回收图片
}
}
完整代码
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;
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(); // 强制回收图片
}
}
}
V. 在Activity中创建并实例化对象
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添加到布局管理器中
}
}
-
素材
(提取码:lewl )