大家好,今晚给大家分享的是一个有趣的Demo实现小火箭升空,其实就是一个动画效果,拖拉到底部,松手,小火箭缓缓上升,直至到顶部消失。我就把这个小火箭命名为杰哥号吧,好记辨识度强。做的杰哥号小火箭涉及的技术矩阵位置改变,少许动画效果,开辟子线程,大概就是这样。图一是火箭起始点,未拖拉,图二是火箭已到底部释放,飞行了半路,图三是火箭块到顶部界点。下面我为大家详细讲解。
1.res/layout/activity_rocket.xml布局文件
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
//设置小火箭ImageView,类型是:matrix矩形类型,src是帧动画,通过这样小火箭显示才有动的感觉
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="4"
android:scaleType="matrix"
android:src="@drawable/rocket_anim_list" />
//屏幕地下的云,设置为移除状态
android:layout_width="wrap_content"
android:layout_height="0dp"
android:layout_weight="1"
android:visibility="gone"
android:src="@drawable/desktop_smoke_m" />
2.MainActivity.java编写实现代码
public class RocketActivity extends Activity {
private ImageView mRocketIv;
private Matrix matrix = new Matrix();//图形矩阵,用于缩放平移矩阵
private Matrix startMatrix = new Matrix();//开始的矩阵
private Vibrator vibrator;//系统震动
private PointF pointF;//开始按下的点
private 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);
//初始化组件
mRocketIv = (ImageView) findViewById(R.id.rocket_iv);
mSmokeIv=(ImageView) findViewById(R.id.smoke_iv);
//初始化震动,得到系统震动,getSystemService
vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
//图片触摸事件,小火箭实现升空,按,拖拉,放,是触摸效果
mRocketIv.setOnTouchListener(new MyOnTouchListener());
}
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.vibrate(100);//每个0.1秒开始震动
/得到/起始点的位置
pointF=new PointF(event.getX(), event.getY());
//得到图片矩阵开始的位置
startMatrix.set(mRocketIv.getImageMatrix());
break;
//移动状态
case MotionEvent.ACTION_MOVE:
vibrator.vibrate(100)
//取得偏移量,现在的坐标-起始点的坐标
float dx=event.getX()-pointF.x;
float dy=event.getY()-pointF.y;
matrix.set(startMatrix); //设置起始矩阵
//平移矩阵
matrix.postTranslate(dx, dy);
break;
//松开手指状态,无手指
case MotionEvent.ACTION_UP:
vibrator.cancel();//取消震动
//构建发射火箭的方法
sendRocket();
break;
default:
break;
}
//重新设置图片矩阵位置
mRocketIv.setImageMatrix(matrix);
return true;//返回为true
}
}
//发射火箭是耗时操作,需要开辟子线程
public void sendRocket() {
new Thread(new Runnable() {
//休眠0.1秒,每个0.1秒发射一次,不休眠的话,直接高速发射,系统处理的非常快
public void run() {
//for 循环用于更新发射,更新休眠
for(int i=0;i<1000;i++){
SystemClock.sleep(100);
//发射消息机制,空消息
handler.sendEmptyMessage(0);
}
}
}).start();
}
}
今晚的小火箭就实现了,最难理解的是矩形的使用,只有能理解到矩形的用法,应该问题不大了。晚安。