目录
案例演示——通过单点移动米老鼠
1、创建安卓应用
- 选择模板
- 完善项目信息
2、添加背景图片和米老鼠图片
3、编写主布局资源文件
4、编写主界面类
- 源代码
package net.zs.movemickey;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
protected static final String TAG = "move_mickey_by_touch";
private ImageView ivMickey;
private LinearLayout root;
private LinearLayout.LayoutParams LayoutParams;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);
// 通过控件资源索引获得控件实例
ivMickey = (ImageView) findViewById(R.id.ivMickey);
root = (LinearLayout) findViewById(R.id.root);
// 设置根布局可以获得焦点
root.setFocusable(true);
// 让根布局获得焦点
root.requestFocus();
// 获取图像控件的布局参数
LayoutParams = (LinearLayout.LayoutParams) ivMickey.getLayoutParams();
// 给根布局注册触摸监听器,实现触摸监听器接口,编写触摸事件代码
root.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// 根据触摸动作执行不同的操作
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: // 触点按下
Log.d(TAG, "ACTION_DOWN(" + event.getX() + "," + event.getY() + ")");
break;
case MotionEvent.ACTION_MOVE: // 触点移动
Log.d(TAG, "ACTION_MOVE(" + event.getX() + "," + event.getY() + ")");
break;
case MotionEvent.ACTION_UP: // 触点放开
Log.d(TAG, "ACTION_UP(" + event.getX() + "," + event.getY() + ")");
}
// 根据变化的触点坐标来更新图像控件的布局参数
LayoutParams.leftMargin = (int) event.getX();
LayoutParams.topMargin = (int) event.getY();
// 重新设置图像控件的布局参数
ivMickey.setLayoutParams(LayoutParams);
return true; // 设置为真,三个事件:down-->move-->up才会依次执行
}
});
}
}
5、运行程序,查看效果
6、修改主界面类
7、运行程序,查看效果
案例演示——通过多点触摸缩放米老鼠
1、创建安卓应用
- 选择模板
- 完善项目信息
2、添加背景图片和米老鼠图片
3、编写主布局资源文件
- 源代码
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@drawable/background" >
<ImageView
android:id="@+id/ivMickey"
android:layout_width="100dp"
android:layout_height="120dp"
android:scaleType="fitXY"
android:src="@drawable/mickey" />
</LinearLayout>
4、编写主界面类
- 源代码
package net.zs.zoommickey;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
public class MainActivity extends AppCompatActivity {
private ImageView ivMickey; // 米老鼠图像控件
private LinearLayout root; // 线性根布局
private LinearLayout.LayoutParams layoutParams; // 线性布局型布局参数
private float x1, y1; // 第一个触点的坐标
private float x2, y2; // 第二个触点的坐标
private float next_x1, next_y1; // 第一个触点下一次的坐标
private float next_x2, next_y2; // 第二个触点下一次的坐标
private float distance; // 两个触点之间的距离
private float next_distance; // 两个触点之间下一次的距离
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 利用布局资源文件设置用户界面
setContentView(R.layout.activity_main);
// 通过资源标识符获取控件实例
ivMickey = findViewById(R.id.ivMickey);
root = findViewById(R.id.root);
// 设置根布局可以获得焦点
root.setFocusable(true);
// 让根布局获取焦点
root.requestFocus();
// 获取图像控件的布局参数
layoutParams = (LinearLayout.LayoutParams) ivMickey.getLayoutParams();
// 给根布局注册触摸监听器
root.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// 根据触点个数执行不同的操作(两个触点缩放图像,单个触点移动图像)
if (event.getPointerCount() == 2) { // 双点触摸
// 根据触摸动作执行不同的操作
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN: // 触点按下
// 获取第一个触点的坐标
x1 = event.getX(0);
y1 = event.getY(0);
// 获取第二个触点的坐标
x2 = event.getX(1);
y2 = event.getY(1);
// 计算两个触点之间的距离
distance = (float) Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
break;
case MotionEvent.ACTION_MOVE: // 触点移动
// 获取第一个触点下一次的坐标
next_x1 = event.getX(0);
next_y1 = event.getY(0);
// 获取第二个触点下一次的坐标
next_x2 = event.getX(1);
next_y2 = event.getY(1);
// 计算两个触点之间下一次的距离
next_distance = (float) Math.sqrt(Math.pow(next_x2 - next_x1, 2) + Math.pow(next_y2 - next_y1, 2));
break;
case MotionEvent.ACTION_UP: // 触点放开
break;
}
// 修改图像控件的布局参数
if (next_distance > distance) {
layoutParams.width = (int) (layoutParams.width * 1.05);
layoutParams.height = (int) (layoutParams.height * 1.05);
} else {
layoutParams.width = (int) (layoutParams.width * 0.95);
layoutParams.height = (int) (layoutParams.height * 0.95);
}
// 坐标迭代
x1 = next_x1;
y1 = next_y1;
x2 = next_x2;
y2 = next_y2;
// 两个触点之间的距离
distance = distance = (float) Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));
} else if (event.getPointerCount() == 1) { // 单点触摸
if (event.getAction() == MotionEvent.ACTION_MOVE) {
// 修改图像控件的布局参数(因为线性布局gravity设置为center,所以要减去屏幕一半尺寸)
layoutParams.leftMargin = (int) event.getX() - getWindowManager().getDefaultDisplay().getWidth() / 2;
layoutParams.topMargin = (int) event.getY() - getWindowManager().getDefaultDisplay().getHeight() / 2;
}
}
// 重新设置图形控件的布局参数
ivMickey.setX(event.getX() - ivMickey.getWidth() / 2);
ivMickey.setY(event.getY() - ivMickey.getHeight() / 2);
ivMickey.setLayoutParams(layoutParams);
return true; // 设置为真,三个事件:down-->move-->up才会依次执行
}
});
}
}
5、运行程序,查看效果
- 可在手机上尝试是否能放大缩小