編輯:關於Android編程
小豬的Android入門之路 Day 4 - part 4
Android事件處理機制之——事件處理機制拾遺
------------轉載請注明出處——coder-pig
本節引言:
在前面三個部分中,對於android的事件處理機制的學習已經學得七七八八了,
基於監聽與回調的時間處理機制,以及使用Handler傳遞信息的機制都已經學了;
在最後這個部分中會對一些小的知識點進行補充,比如觸摸事件的兩種形式,
Configuration類以及異步任務AsyncTask進行講解,好了,開始本節的課程吧!
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGJyPgo8L3A+CjxwPjxzdHJvbmc+1f3OxDo8L3N0cm9uZz48L3A+CjxwPjxicj4KPC9wPgo8aDE+tKXD/srCvP48L2gxPgo8cD48YnI+CjwvcD4KPHA+ttTT2rSlw/7Kwrz+LNPQ0tTPwsG91tbQzsq9wLTKtc/WLNK7uPbKx7v509q84Mz9tcQs0ru49srHu/nT2rvYtfe1xCzPwsPmzai5/TwvcD4KPHA+vPK1pbXEyr7A/b340NC9sr3iOjwvcD4KPHA+PGJyPgo8L3A+CjxwPjxicj4KPC9wPgo8aDI+otm7+dPavODM/bXEVG91Y2hMaXN0ZW5lcjwvaDI+CjxwPtCnufvNvDo8L3A+CjxwPjxpbWcgc3JjPQ=="/uploadfile/Collfiles/20140808/201408080932477.jpg" alt="\">
代碼如下:
main.xml:
MainAcitivity.java
package example.jay.com.touch1; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; public class MyActivity extends ActionBarActivity { private ImageView imgtouch; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); imgtouch = (ImageView)findViewById(R.id.imgtouch); imgtouch.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { Toast.makeText(getApplicationContext(),"你通過監聽器模式:OnTouchListener摸了倫家~",Toast.LENGTH_LONG).show(); return true; } }); } }
代碼解析:
就是簡單的設置一個ImageView,然後setOnTouchListener,重寫onTouch方法即可!很簡單,其實這個在幀布局那一節已經有
個例子了:隨手指移動的萌妹子
最後還要說下OnTouchListener的一些相關方法與屬性:
onTouch(View v, MotionEvent event):這裡面的參數依次是觸發觸摸事件的組件,觸碰事件event
封裝了觸發事件的詳細信息,同樣包括事件的類型、觸發時間等信息。比如event.getX(),event.getY()
我們也可以對觸摸的動作類型進行判斷,使用event.getAction( )再進行判斷;如:
event.getAction == MotionEvent.ACTION_DOWN,按下事件
event.getAction == MotionEvent.ACTION_MOVE:移動事件
event.getAction == MotionEvent.ACTION_UP:彈起事件
當然除了這幾個還有多指觸碰的,更多相關可查看開發文檔,這裡就不一一列出了!
同樣式觸碰事件,但是onTouchEvent更多的是用於自定義的view,所有的view類中都重寫了該方法,而這種觸摸事件是基於回調的,也就是說:
如果我們返回的值是false的話,那麼事件會繼續向外傳播,由外面的容器或者Activity進行處理!當然還涉及到了手勢(Gesture),這個我們
會在後面進行詳細的講解!onTouchEvent其實和onTouchListener是類似的,只是處理機制不用,前者是回調,後者是監聽模式!
簡單的代碼示例:隨手指移動的小球
自定義View
MyView.java
package example.jay.com.touch2; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; public class MyView extends View{ public float X = 50; public float Y = 50; //創建畫筆 Paint paint = new Paint(); public MyView(Context context,AttributeSet set) { super(context,set); } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); paint.setColor(Color.BLUE); canvas.drawCircle(X,Y,30,paint); } @Override public boolean onTouchEvent(MotionEvent event) { this.X = event.getX(); this.Y = event.getY(); //通知組件進行重繪 this.invalidate(); return true; } }
main.xml布局文件:
運行截圖:
用手指觸摸進行移動~
該類是專門用於描述手機設備上的配置信息,比如屏幕方向,觸摸屏的觸摸方式等等
用法:①獲取系統的Configuration對象
Configuration cfg = getResources().getConfiguration();
②接著要獲取什麼屬性就cfg.XXX就可以了,用的較多就是屏幕的判斷,其他需要時再來查表
fontScale:獲取當前用戶設置的字體的縮放因子。
keyboard:獲取當前設備所關聯的鍵盤類型。該屬性的返回值:KEYBOARD_12KEY(只有12個鍵的小鍵盤)、KEYBOARD_NOKEYS、KEYBOARD_QWERTY(普通鍵盤)
keyboardHidden:該屬性返回一個boolean值用於標識當前鍵盤是否可用。該屬性不僅會判斷系統的硬件鍵盤,也會判斷系統的軟鍵盤(位於屏幕)。
locale:獲取用戶當前的Locale.
mcc:獲取移動信號的國家碼
mnc:獲取移動信號的網絡碼
ps:國家代碼和網絡代碼共同確定當前手機網絡運營商
navigation:判斷系統上方向導航設備的類型。該屬性的返回值:NAVIGATION_NONAV(無導航)、NAVIGATION_DPAD(DPAD導航)
NAVIGATION_TRACKBALL(軌跡球導航)、NAVIGATION_WHEEL(滾輪導航)
orientation:獲取系統屏幕的方向。該屬性的返回值:ORIENTATION_LANDSCAPE(橫向屏幕)、ORIENTATION_PORTRAIT(豎向屏幕)
touchscreen:獲取系統觸摸屏的觸摸方式。該屬性的返回值:TOUCHSCREEN_NOTOUCH(無觸摸屏)、TOUCHSCREEN_STYLUS(觸摸筆式觸摸屏)、
TOUCHSCREEN_FINGER(接收手指的觸摸屏)
該方法用於監聽系統設置的更改,是基於回調的時間處理方法,當系統的設置發生改變時就會自動觸發;
但是要注意一點,使用下面的方法監控的話,targetSdkVersion屬性最高只能設置為12,高於12的話,該方法不會被激發!
關於監控系統設置的改變,再後面後繼續研究,現在暫且先掌握這個!
代碼示例:
簡單的一個按鈕,點擊後切換橫豎屏,然後Toast提示
效果圖如下:
代碼如下:
MainActivity.java
package com.example.configurationchangedemo; import android.app.Activity; import android.content.pm.ActivityInfo; import android.content.res.Configuration; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button btn = (Button) findViewById(R.id.btncahange); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Configuration config = getResources().getConfiguration(); //如果是橫屏的話切換成豎屏 if(config.orientation == Configuration.ORIENTATION_LANDSCAPE) { MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); } //如果豎屏的話切換成橫屏 if(config.orientation == Configuration.ORIENTATION_PORTRAIT) { MainActivity.this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); } } }); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); String screen = newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE?"橫屏":"豎屏"; Toast.makeText(MainActivity.this, "系統屏幕方向發生改變 \n 修改後的方向為" + screen, Toast.LENGTH_SHORT).show(); } }
在文件中加入以下代碼:
權限:
在android:configChanges="orientation"
將targetSdkVersion改為12以下的,12也可以
一個簡單的進度條+按鈕+文本框
因為我們還沒講到網絡那塊,所以這裡用延時線程來模擬下載文件的過程
效果圖:
main.xml布局文件:
自定義延時線程:
package example.jay.com.asynctaskdemo; public class DelayOperator { //延時操作,用來模擬下載 public void delay() { try { Thread.sleep(1000); }catch (InterruptedException e){ e.printStackTrace();; } } }
自定義AsyncTask
package example.jay.com.asynctaskdemo; import android.os.AsyncTask; import android.widget.ProgressBar; import android.widget.TextView; /** * Created by Administrator on 8/7/2014. */ public class MyAsyncTask extends AsyncTask{ private TextView txt; private ProgressBar pgbar; public MyAsyncTask(TextView txt,ProgressBar pgbar) { super(); this.txt = txt; this.pgbar = pgbar; } //該方法不運行在UI線程中,主要用於異步操作,通過調用publishProgress()方法 //觸發onProgressUpdate對UI進行操作 @Override protected String doInBackground(Integer... params) { DelayOperator dop = new DelayOperator(); int i = 0; for (i = 10;i <= 100;i+=10) { dop.delay(); publishProgress(i); } return i + params[0].intValue() + ""; } //該方法運行在UI線程中,可對UI控件進行設置 @Override protected void onPreExecute() { txt.setText("開始執行異步線程~"); } //在doBackground方法中,每次調用publishProgress方法都會觸發該方法 //運行在UI線程中,可對UI控件進行操作 @Override protected void onProgressUpdate(Integer... values) { int value = values[0]; pgbar.setProgress(value); } }
package example.jay.com.asynctaskdemo; import android.support.v7.app.ActionBarActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; public class MyActivity extends ActionBarActivity { private TextView txttitle; private ProgressBar pgbar; private Button btnupdate; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); txttitle = (TextView)findViewById(R.id.txttitle); pgbar = (ProgressBar)findViewById(R.id.pgbar); btnupdate = (Button)findViewById(R.id.btnupdate); btnupdate.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { MyAsyncTask myTask = new MyAsyncTask(txttitle,pgbar); myTask.execute(1000); } }); } }
ps:代碼示例都是從網上參考的一些簡單的例子,看懂應該不是什麼大的問題,先弄懂基本原理,是我們目前要做的;
等以後做項目遇到在深入地去研究~
package com.example.app; import java.util.ArrayList; import java.util.HashMap; imp
華為榮耀暢玩5x於去年10月份上市至今,是華為的中低端手機中口碑較好的一款,而華為榮耀5c是今年4月份剛剛上市的,剛上市就有花粉在問華為榮耀5x和5c哪個好
這兩天學習了使用Path繪制貝塞爾曲線相關,然後自己動手做了一個類似QQ未讀消息可拖拽的小氣泡,效果圖如下:最終效果圖接下來一步一步的實現整個過程。基本原理其實就是使用P
1.采用PUSCH跳頻時需要注意的問題在上行子幀中,PUCCH信道處於帶寬的高低兩側,或者說位於頻帶的邊緣,PUSCH信道則位於帶寬的中間。PUCCH信道也以RB對為基本