Advertisement

小火箭升空动画大全解

阅读量:

您好,今夜向大家介绍一个有趣的Demo项目——小火箭升空的动画效果。其实整个过程非常简单:轻轻拉动底部的手柄松手后火箭就会缓缓升离地面直至升至高空消失。为了方便大家记忆这个项目取名为"杰哥号"既好记又便于辨认。在开发过程中涉及的技术矩阵位置发生了微调略微增加了动画效果并启动了子线程来控制飞行轨迹大致就是这样。起始状态如图一所所示是未进行任何操作的状态。当拉动底部至最底部时动画开始运行半路时显示火箭已经离开地面(如图二所示)。最终完成的火箭块到达指定高度后会停止动画显示到顶端消失(如图三所示)。下面我将详细为大家讲解整个项目的开发过程

1.res/layout/activity_rocket.xml布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" width方向上与父元素匹配 height方向上与父元素匹配 排列方式为纵向>

// 配置小火箭ImageView
// 使用matrix矩阵类型的图像显示
// src指定为帧动画序列
// 通过这样的方式展示才能产生动态效果

ImageView布局信息如下:

  • ID:@roid/rocket_iv
  • 宽度:匹配父容器
  • 高度:零
  • 权重:四
  • 缩放类型:矩阵式
  • 图片源地址:@drawable/rocket_anim_list

//屏幕地下的云,设置为移除状态

<ImageView
android:id = '@+id:smoke_iv'
width = wrap_content
height = 0dp
weight = 1
visible = false
src('@drawable/desktop_smoke_m') />

2.MainActivity.java编写实现代码

这是某个应用中的一个活动类名为RocketActivity继承自Activity类私有字段mRocketIv保存的是一个ImageView对象该字段用于显示火箭图像初始化图形矩阵用于缩放和平移操作在图形渲染过程中会用到这些矩阵以实现动画效果私有字段matrix初始化为新的Matrix实例代表当前的图形变换矩阵startMatrix也是一个新创建的Matrix实例它表示初始状态下的变换矩阵该变量通常会在初始化阶段被赋值以定义动画的基础变换参数例如缩放和平移操作该变量可能还被用来作为参考来比较后续的变化情况私有字段vibrator表示系统中的震动传感器该传感器用于检测设备的状态变化并提供相应的反馈信号私有字段pointF是一个PointF类型的数据成员它记录了用户开始按压的位置坐标以便后续的操作计算例如碰撞检测或动画轨迹计算另外还有一个私有的ImageView对象mSmokeIv它可能用于显示烟雾效果或者某种视觉效果以增强用户体验

//为接收消息设计消息机制
private Handler handler = new Handler(
public void handleMessage(android.os.Message msg) {
//更新UI组件的位置
matrix.postTranslate(0, -20);
//重新设置图片矩形位置
mRocketIv.setImageMatrix(matrix);
}
)

//底部的云出现
mSmokeIv.setVisibility(View.VISIBLE);

};
};

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_rocket);
}

//初始化组件

m Rocket IView is obtained by accessing the widget identified by R.id.rocket_iv.
m Smoke IView is accessed via the widget identified by R.id.smoke_iv.
The vibrator instance is retrieved from the system services by calling getSystemService with VIBRATOR_SERVICE.

// 图像触摸事件中,“小火箭发射升空”,按下、拖动、放下,则属于触摸效果
mRocketIv.setOnswiper(new MyOnswiper());

}
private class MyOnTouchListener implements OnTouchListener {

/*event.getAction() :取得事件的动作 ,它是16为二进制数,动作是存放在低八位,即要把低八位的数据取出

  • ACTION_MASK : 动作掩码 ,值是255 ,取低八位
  • ip mask :255.255.255.0
  • &:位与操作

*/
public boolean onTouch(View v, MotionEvent event) {

//ACTION_MASK掩码,取得是低八位,事件动作是16二进制

switch (event.getAction()&MotionEvent.ACTION_MASK) {

// 手指按下的状态仅有一只手指
case MotionEvent.ACTION_DOWN:
vibrator.vibration(100); // 每隔 0.1 秒执行一次
/
获得初始触点位置
pointF = new PointF(event.getX(), event.getY());

//请获取起始点所在的图片矩阵位置
startMatrix.set(mRocketIv.getImageMatrix());
break;
//当发生移动动作时
case MotionEvent.ACTION_MOVE:
执行一次振动动作。
//计算水平偏移量dx为当前 touch X坐标与起始点X坐标的差值;
float dx = event.getX() - pointF.x;
计算垂直偏移量dy为当前 touch Y坐标与起始点Y坐标的差值;
float dy = event.getY() - pointF.y;

matrix.assign(initialMatrix); //赋值初始矩阵
//进行平移变换
matrix.translate(dx, dy);
exit();

//松开双手(取消抓取)
case MotionEvent.ACTION_UP:
stop the vibrator.; //停止震动
//构建发射火箭的方法
sendRocket();

break;

default:
break;
}

//重新配置图片矩阵的位置
图像矩阵的配置已被成功完成,并返回布尔值true.

}

//发射火箭是一项耗时的任务,必须启动子线程以处理

// 每隔0.1秒执行一次暂停操作,在无需暂停的情况下立即以高速模式执行
public void run() {
// 每隔0.1秒执行一次暂停操作,在无需暂停的情况下立即以高速模式执行
// 该方法旨在确保系统能够快速响应而不导致性能瓶颈
}

//该for循环用于更新发射状态并休眠
for(int i=0;i<1000;i++){
SystemClock.sleep(100);
}
//通过发送空消息实现消息机制
handler.sendEmptyMessage(0);

}
}).start();

}

}

今晚的小火箭任务已经成功完成。最难以掌握的是矩形的应用方法。只有深入掌握了矩形的应用方法。看来不会有太大的困难。晚安。

全部评论 (0)

还没有任何评论哟~