編輯:關於Android編程
首先,定義一個服務,在這個服務裡面,完成土司的創建(小火箭布局創建)
煙的效果屬於動畫播放,而且要依托一個activity。(這個activity要定義為透明狀態)
定義煙的activity的布局文件
package com.itydl.rockets; import android.app.Activity; import android.os.Bundle; import android.os.SystemClock; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.AnimationSet; import android.view.animation.ScaleAnimation; import android.widget.ImageView; public class SmokeActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.smoke); //底部煙圖片 ImageView iv_m = (ImageView) findViewById(R.id.smoke_m); //煙柱子 ImageView iv_t = (ImageView) findViewById(R.id.smoke_t); //漸變動畫 AlphaAnimation aa = new AlphaAnimation(0.0f,1.0f); aa.setDuration(1000); //比例動畫 設置錨點。x軸一半,y軸圖片最低端y值最大處 ScaleAnimation sa = new ScaleAnimation(1.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 1f); sa.setDuration(1000); //動畫集添加動畫 iv_m.startAnimation(aa);//給下面這張圖片實現漸變動畫 AnimationSet as = new AnimationSet(true); as.addAnimation(aa); as.addAnimation(sa); //給上邊圖片(煙柱子)設置漸變動畫和比例動畫 iv_t.startAnimation(as); //1秒後關閉Activity,正好動畫播完,關閉這個activity。這裡也是那樣,主線程動畫的同時,子線程也在執行耗時操作 new Thread(){ public void run() { //1秒後關閉當前Activity SystemClock.sleep(1000); runOnUiThread(new Runnable() {//activity類中的方法 @Override public void run() { // TODO Auto-generated method stub finish();//關閉自己也屬於更新界面操作,因此要在主線程執行。 } }); }; }.start(); } }
定義Service,用於自定義土司布局,加入火箭圖片的動畫、參數初始化、觸摸事件等
package com.itydl.rockets; import android.app.Service; import android.content.Intent; import android.graphics.PixelFormat; import android.graphics.drawable.AnimationDrawable; import android.os.Handler; import android.os.IBinder; import android.os.SystemClock; import android.view.Gravity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.WindowManager; import android.widget.ImageView; public class RocketService extends Service { private WindowManager.LayoutParams params; private View view; private WindowManager wm; @Override public IBinder onBind(Intent intent) { // TODO Auto-generated method stub return null; } @Override public void onCreate() { wm = (WindowManager) getSystemService(WINDOW_SERVICE); //初始化params(土司參數) initToastParams(); showRocket();//打開小火箭 super.onCreate(); } /** * 初始化土司的參數 */ private void initToastParams() { // TODO Auto-generated method stub // XXX This should be changed to use a Dialog, with a Theme.Toast // defined that sets up the layout params appropriately. params = new WindowManager.LayoutParams(); params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.width = WindowManager.LayoutParams.WRAP_CONTENT; //對齊方式左上角 params.gravity = Gravity.LEFT | Gravity.TOP; 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_SYSTEM_ALERT;// 土司天生不響應事件,改變類型。TYPE_SYSTEM_ALERT系統彈窗 params.setTitle("Toast"); } private void closeRocket(){ if (view != null) { wm.removeView(view);//移除小火箭 } } private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { wm.updateViewLayout(view, params);//更新小火箭在屏幕中的位置,刷新位置。屬於更新ui。在主線程執行(更新土司的位置) }; }; private void showRocket(){ //小火箭的布局 view = View.inflate(getApplicationContext(), R.layout.rocket, null); ImageView iv_rocket = (ImageView) view.findViewById(R.id.iv_rocket); //獲取小火箭的動畫背景 AnimationDrawable ad = (AnimationDrawable) iv_rocket.getBackground(); //開始小火箭動畫(小火箭動畫,兩張圖片切換) ad.start(); //給小火箭加觸摸事件(給自定義土司加觸摸事件),按住拖動小火箭到屏幕正下方,松開發射火箭 view.setOnTouchListener(new OnTouchListener() { private float startX; private float startY; @Override public boolean onTouch(View v, MotionEvent event) { System.out.println(event.getX() + ":" + event.getRawX()); // 拖動土司 switch (event.getAction()) { case MotionEvent.ACTION_DOWN:// 按下 startX = event.getRawX(); startY = event.getRawY(); break; case MotionEvent.ACTION_MOVE:// 按下移動,拖動 //新的 x y坐標 float moveX = event.getRawX();//移動後的x坐標 float moveY = event.getRawY();//移動後的y坐標 //dx x方向的位置變化值 dy y方向的位置變化值 float dx = moveX - startX; float dy = moveY - startY; //改變土司的坐標 params.x += dx; params.y += dy; //重新獲取新的x y坐標 startX = moveX; startY = moveY; //更新土司的位置 wm.updateViewLayout(view, params); break; case MotionEvent.ACTION_UP:// 松開,接下來要發射小火箭 //判斷位置 發射 //x軸方向 離兩邊框超過100,y軸方向大於200 就可以發射火箭 if (params.x > 100 && params.x + view.getWidth()< wm.getDefaultDisplay().getWidth() - 100 && params.y > 200){ //發射火箭 //1,火箭往上跑 //火箭在中心線上發射(自定義土司左上角為基准) params.x = (wm.getDefaultDisplay().getWidth() - view.getWidth()) / 2; new Thread(){//發射火箭改變y軸屬於耗時操作,更新火箭位置是更新UI操作 public void run() { for (int j = 0; j < view.getHeight(); ) { SystemClock.sleep(50);//休眠50毫秒 params.y -= j; j += 5; handler.obtainMessage().sendToTarget();//參數y的值改變一次,發消息通知更新一次ui,更新一次土司的位置 } //,發射完畢,關閉小火箭 stopSelf();//關閉服務,關閉當前自己服務。這個方法用在關閉自己服務裡。觸發onDestroy方法,從而觸發這個方法裡面的關閉小火箭 }; }.start(); //2,煙的效果。因為更新火箭往上跑是在子線程執行的,因此在小火箭往上跑的同時,煙的效果也同時開始播放(子線程不影響主線程執行。兩個線程可以同時進行) //煙的效果,是一個動畫,在activity完成,這個activity需要定義為透明 Intent intent = new Intent(RocketService.this,SmokeActivity.class); //在服務中打開activity,需要設置任務棧: intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//任務棧 startActivity(intent);//啟動煙的Activity } //冒煙的Activity default: break; } return false;//默認返回值。 } }); wm.addView(view, params);//把小火箭加到窗體管理器 } @Override public void onDestroy() { // TODO Auto-generated method stub closeRocket();//關閉小火箭 super.onDestroy(); } }對於主動人任務只是加入個按鈕,打開這個服務就行了。
package com.itydl.rockets; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /** * 通過點擊按鈕打開小火箭 * @param v */ public void openRocket(View v){ //RocketService service = new RocketService(); Intent service = new Intent(this,RocketService.class); startService(service);//啟動小火箭服務 finish();//關閉當前界面。因為要顯示火箭發射,不能在這個activity裡面演示 } }最後清單文件配置上兩個活動和一個服務,還有一個彈出窗體的權限
需要完整代碼請留言,或者歡迎到github上下載源代碼。
步驟: 1.檢測當前版本的信息AndroidManifest.xml-->manifest-->android:versionName。 2.從服務器獲取版本
大部分手機上邊都會有一個“MENU”鍵,在一個應用安裝到手機上之後,可以通過“MENU”顯示該應用關聯的菜單。 但是,從Android 3.0開始,Android不再要求
在蘋果的iOS下面,有個應用Air Video,可以在iOS下通過Wifi遠程直接播放電腦裡的視頻,而不需要把視頻復制到手機上再看。非常好用!最近用了Android的手
小米在今年5月份帶來了大屏旗艦產品小米Max,該機配備了高達6.44英寸的大屏,一舉成為時下最為火熱的大屏手機。而這款小米Max手機也有多個版本,以滿足不同