小火箭升空动画大全解

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

小火箭升空动画大全解_第1张图片小火箭升空动画大全解_第2张图片




小火箭升空动画大全解_第3张图片


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

    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

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

            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" />

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

            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" />

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

}

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






你可能感兴趣的:(小火箭升空动画大全解)