日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

拖拽升空的Android小火箭

發布時間:2023/12/10 Android 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 拖拽升空的Android小火箭 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先上演示效果


1、MainActivity

主布局就兩個Button按鈕 :一開啟、二關閉 就不貼主布局xml了

因為小火箭是游離在activity之外的,所以不能依賴activity的生命周期

需要注意的一點是不要忘記在清單文件里配置 service

貼一下代碼:

public class MainActivity extends Activity {private Button open,close;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main);initView();}/*** 初始化*/private void initView() {// TODO Auto-generated method stubopen = (Button) findViewById(R.id.open);close = (Button) findViewById(R.id.close);/*** 開啟火箭*/open.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubstartService(new Intent(MainActivity.this,RocketService.class));finish();}});/*** 關閉火箭*/close.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubstopService(new Intent(MainActivity.this,RocketService.class));finish();}});} }

2、RocketService 火箭服務類

該類主要是實現小火箭掛載在屏幕窗體

實現屏幕隨意拖拽

拖拽到指定位置自動發射

貼代碼:

/***結合1、2、3.順序看 注釋比較詳細*/ public class RocketService extends Service {private final WindowManager.LayoutParams mParams = new WindowManager.LayoutParams();private WindowManager mWM;private int height;private int width;private View viewToast;private ImageView iv_rocket;private AnimationDrawable drawable;@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();//獲取屏幕窗體mWM = (WindowManager) getSystemService(WINDOW_SERVICE);//獲取屏幕寬高height = mWM.getDefaultDisplay().getHeight();width = mWM.getDefaultDisplay().getWidth();//開啟火箭showRocket();}/*** 開啟小火箭*/private void showRocket() {//1、讓小火箭默認在左上角顯示final WindowManager.LayoutParams params = mParams;params.height = WindowManager.LayoutParams.WRAP_CONTENT;params.width = WindowManager.LayoutParams.WRAP_CONTENT;params.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE // | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE 默認能夠被觸摸| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;params.format = PixelFormat.TRANSLUCENT;//在響鈴的時候顯示吐司,和電話類型一致params.type = WindowManager.LayoutParams.TYPE_PHONE;params.setTitle("Toast");//指定吐司的所在位置(將吐司指定在左上角)params.gravity = Gravity.LEFT+Gravity.TOP;//2、 定義吐司layout布局 -填充給 >view掛載到屏幕上顯示viewToast = View.inflate(this, R.layout.rocket_view, null);iv_rocket = (ImageView) viewToast.findViewById(R.id.iv_rocket);//拿到動畫的額幀drawable = (AnimationDrawable) iv_rocket.getBackground();//iv_rocket.startAnimation(drawable);//獲取背景圖片后,讓其動起來drawable.start();//3、圖片手指拖動到額監聽事件iv_rocket.setOnTouchListener(new OnTouchListener() {//開始的 x y 坐標private int startX; private int startY;@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN://獲取按下的xy坐標startX = (int) event.getRawX();startY = (int) event.getRawY();break;case MotionEvent.ACTION_MOVE://獲取移動xy坐標和按下的xy坐標做差,做差得到的值小火箭移動的距離//移動過程中做容錯處理//第一次移動到的位置,作為第二次移動的初始位置int moveX = (int) event.getRawX();int moveY = (int) event.getRawY();//做差拿到移動距離int disX = moveX - startX;int disY = moveY - startY;//將按下的坐標+移動距離 = 當前位置重新賦值給窗體params.x = params.x+disX;params.y = params.y+disY;//在窗體中僅僅告知吐司的左上角的坐標if(params.x<0){params.x = 0;}if(params.y<0){params.y = 0;}if(params.x>width-viewToast.getWidth()){params.x = width-viewToast.getWidth();}if(params.y>height-22-viewToast.getHeight()){params.y = height-22-viewToast.getHeight();}//告知吐司在窗體上刷新mWM.updateViewLayout(viewToast, params);//在第一次移動完成后,將最終坐標作為第二次移動的起始坐標startX = (int) event.getRawX();startY = (int) event.getRawY();break;case MotionEvent.ACTION_UP://手指放開的時候,如果放手坐標,則指定區域內if(params.x>200 && params.x<300 && params.y>300){//火箭的發射sendRocket();//在開啟火箭過程中,去開啟一個新的activity,activity透明,在此activity中放置兩張圖片(淡入淡出效果)Intent intent = new Intent(getApplicationContext(),BackgroundActivity.class);//指定開啟新的activity任務棧intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);startActivity(intent);}break;}return true;}});//4、將自定義的tosat布局添加到窗體管理器中mWM.addView(viewToast, params);}private Handler handler = new Handler(){public void handleMessage(Message msg) {mParams.y = (Integer) msg.obj;//更新到火箭上(窗體)mWM.updateViewLayout(viewToast, mParams);};};private void sendRocket() {new Thread(){public void run() {for(int i=0;i<11;i++){int y = 350 - i*35;//350 是當前模擬器高//睡眠try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}//通過消息機制,將y軸坐標作為主線程火箭豎直方向上的顯示位置Message msg = Message.obtain();msg.obj = y;handler.sendMessage(msg);}};}.start();}@Overridepublic void onDestroy() {if(mWM!=null && viewToast!=null){mWM.removeView(viewToast);}super.onDestroy();}@Overridepublic IBinder onBind(Intent intent) {return null;} }

3、BackgroundActivity 小火箭尾氣

該類完成小火箭發射尾氣動畫的實現
代碼不多 主要就是一個淡入淡出的動畫

public class BackgroundActivity extends Activity {private Handler mHandler = new Handler(){public void handleMessage(android.os.Message msg) {//結束此activity,銷毀尾氣圖片finish();};};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//設置尾氣圖片setContentView(R.layout.activity_background);ImageView iv_top = (ImageView) findViewById(R.id.iv_top);ImageView iv_bottom = (ImageView) findViewById(R.id.iv_bottom);//尾氣淡入淡出效果,動畫是異步操作,并不會去阻塞主線程AlphaAnimation alphaAnimation = new AlphaAnimation(0, 1);alphaAnimation.setDuration(500);iv_top.startAnimation(alphaAnimation);iv_bottom.startAnimation(alphaAnimation);//將尾氣消失,發送一個延時消息,1秒以后結束此activity,mHandler.sendEmptyMessageDelayed(0, 1000);} }

清單文件中的注冊需要加一個主題:

<activity android:theme="@android:style/Theme.Translucent.NoTitleBar"android:name="com.example.demo2_rocket.BackgroundActivity"/>

xml布局

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent" ><ImageView android:id="@+id/iv_bottom"android:layout_alignParentBottom="true"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/desktop_smoke_m"/><ImageView android:id="@+id/iv_top"android:layout_above="@id/iv_bottom"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/desktop_smoke_t"/> </RelativeLayout>

動畫rocket_bg.xml

<?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" ><item android:drawable="@drawable/desktop_rocket_launch_1"android:duration="200"/> <item android:drawable="@drawable/desktop_rocket_launch_2"android:duration="200"/> </animation-list>

好了 完成了,就2個activity 、一個services,看代碼注釋完全可以看明白

Demo鏈接

總結

以上是生活随笔為你收集整理的拖拽升空的Android小火箭的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。