編輯:關於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:代碼示例都是從網上參考的一些簡單的例子,看懂應該不是什麼大的問題,先弄懂基本原理,是我們目前要做的;
等以後做項目遇到在深入地去研究~
一個android的webview的例子
package com.example.app; import java.util.ArrayList; import java.util.HashMap; imp
華為榮耀5x和5c哪個好 華為榮耀5x和5c區別 榮耀5c和5X對比評測
華為榮耀暢玩5x於去年10月份上市至今,是華為的中低端手機中口碑較好的一款,而華為榮耀5c是今年4月份剛剛上市的,剛上市就有花粉在問華為榮耀5x和5c哪個好
Android Path繪制貝塞爾曲線實現QQ拖拽泡泡
這兩天學習了使用Path繪制貝塞爾曲線相關,然後自己動手做了一個類似QQ未讀消息可拖拽的小氣泡,效果圖如下:最終效果圖接下來一步一步的實現整個過程。基本原理其實就是使用P
PUSCH上行跳頻(2)-Type2頻率跳頻
1.采用PUSCH跳頻時需要注意的問題在上行子幀中,PUCCH信道處於帶寬的高低兩側,或者說位於頻帶的邊緣,PUSCH信道則位於帶寬的中間。PUCCH信道也以RB對為基本