Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> 小豬的Android入門之路 Day 4 - part 4

小豬的Android入門之路 Day 4 - part 4

編輯:關於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( )方法

同樣式觸碰事件,但是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類的使用:

該類是專門用於描述手機設備上的配置信息,比如屏幕方向,觸摸屏的觸摸方式等等

用法:①獲取系統的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(接收手指的觸摸屏)




重寫onConfigurationChanged響應系統設置更改


該方法用於監聽系統設置的更改,是基於回調的時間處理方法,當系統的設置發生改變時就會自動觸發;

但是要注意一點,使用下面的方法監控的話,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();
	}
}

還需要配置以下AndroidManifest.xml文件:

在文件中加入以下代碼:

權限:

在android:configChanges="orientation"

targetSdkVersion改為12以下的,12也可以



AsyncTask異步任務


AsyncTask的引入:

\

相關方法:

\


注意事項:

\


代碼示例:

一個簡單的進度條+按鈕+文本框

因為我們還沒講到網絡那塊,所以這裡用延時線程來模擬下載文件的過程

效果圖:

\


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


MainActivity.java

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:代碼示例都是從網上參考的一些簡單的例子,看懂應該不是什麼大的問題,先弄懂基本原理,是我們目前要做的;

等以後做項目遇到在深入地去研究~


  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved