您的位置:首页 > 其它

小火箭升空动画大全解

2015-09-12 23:09 351 查看
大家好,今晚给大家分享的是一个有趣的Demo实现小火箭升空,其实就是一个动画效果,拖拉到底部,松手,小火箭缓缓上升,直至到顶部消失。我就把这个小火箭命名为杰哥号吧,好记辨识度强。做的杰哥号小火箭涉及的技术矩阵位置改变,少许动画效果,开辟子线程,大概就是这样。图一是火箭起始点,未拖拉,图二是火箭已到底部释放,飞行了半路,图三是火箭块到顶部界点。下面我为大家详细讲解。







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

<LinearLayout 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:orientation="vertical">

//设置小火箭ImageView,类型是:matrix矩形类型,src是帧动画,通过这样小火箭显示才有动的感觉

<ImageView

android:id="@+id/rocket_iv"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="4"

android:scaleType="matrix"

android:src="@drawable/rocket_anim_list" />

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

<ImageView

android:id="@+id/smoke_iv"

android:layout_width="wrap_content"

android:layout_height="0dp"

android:layout_weight="1"

android:visibility="gone"

android:src="@drawable/desktop_smoke_m" />

</LinearLayout>

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();

}

}

今晚的小火箭就实现了,最难理解的是矩形的使用,只有能理解到矩形的用法,应该问题不大了。晚安。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: