1. 程式人生 > >Android 向右滑動銷燬(finish)Activity, 隨著手勢的滑動而滑動的效果

Android 向右滑動銷燬(finish)Activity, 隨著手勢的滑動而滑動的效果

今天給大家帶來一個向右滑動銷燬Activity的效果,Activtiy隨著手指的移動而移動,該效果在Android應用中還是比較少見的,在IOS中就比較常見了,例如“網易新聞” ,"美食傑" , "淘寶"等應用採用此效果,而Android應用中“知乎”採用的也是這種滑動切換Activity的效果, 不過我發現“淘寶”並沒有隨著手勢的移動而移動,只是捕捉到滑動手勢,然後產生平滑切換介面的動畫效果,這個在Android中還是很好實現的,  網上很多滑動切換Activity的Demo貌似都是這種效果的吧,如果要實現類似“網易新聞”的隨手勢的滑動而滑動,似乎就要複雜一些了,我之前在IOS中看到"網易新聞"的這種效果就很感興趣,然後群裡也有朋友問我怎麼實現類似“知乎”這個應用的滑動切換的效果,我也特意去下了一個“知乎”,在之前的實現中我遇到了一些瓶頸,沒有實現出來就擱置了在那裡,今天無意中看到給Activity設定透明的背景,於是乎我恍然大悟,真是靈感來源於瞬間,不能強求啊,然後自己就將此效果實現了出來,給大家分享一下,希望給有此需求的你一點點幫助。

不知道大家對Scroller這個類以及View的scrollBy() 和scrollTo()的使用熟悉不?我之前介紹了Scroller類的滑動實現原理Android 帶你從原始碼的角度解析Scroller的滾動實現原理,在那裡面也介紹了scrollBy() 和scrollTo()方法,不明白的同學可以去看看,這對實現此效果有很大的幫助,瞭解scrollBy() 和scrollTo()的朋友應該知道,如果想對某個View(例如Button)就行滾動,我們直接呼叫該View(Button)的scrollBy()方法,並不是該View(Button)進行滾動,而是該View裡面的內容(Button上面的文字)進行滾動,所以我們假如要讓View整體滾動就需要對其View的父佈局呼叫scrollBy()方法,回到這篇文章來,假如我們想要對一個Activity進行滾動,我們就需求對這個Activity佈局檔案的頂層佈局的父佈局進行滾動

例如下面的XML佈局檔案

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >


</LinearLayout>
如果我們對LinearLayout進行滾動,並不能實現我們想要的效果,而只能對LinearLayout裡面的內容或者說是子View進行滾動,所以我們需要獲取利用LinearLayout的getParent()方法獲取父佈局,其實Android系統會對我們的佈局檔案的最外層套一個FrameLayout,所以我們其實就是對FrameLayout進行滾動就行了

瞭解了實現的原理之後,我們就來編寫程式碼吧,首先新建一個android工程,取名SildingFinish

由於我們的需求可能不是在一個介面提供這個滑動切換的效果,所以我們應該將這部分滑動的邏輯抽取出來,我這裡就他寫成了一個擴充套件RelativeLayout的自定義佈局SildingFinishLayout,首先我們看其程式碼

package com.example.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.RelativeLayout;
import android.widget.ScrollView;
import android.widget.Scroller;

/**
 * 自定義可以滑動的RelativeLayout, 類似於IOS的滑動刪除頁面效果,當我們要使用
 * 此功能的時候,需要將該Activity的頂層佈局設定為SildingFinishLayout,
 * 然後需要呼叫setTouchView()方法來設定需要滑動的View
 * 
 * @author xiaanming
 * 
 * @blog http://blog.csdn.net/xiaanming
 * 
 */
public class SildingFinishLayout extends RelativeLayout implements
		OnTouchListener {
	/**
	 * SildingFinishLayout佈局的父佈局
	 */
	private ViewGroup mParentView;
	/**
	 * 處理滑動邏輯的View
	 */
	private View touchView;
	/**
	 * 滑動的最小距離
	 */
	private int mTouchSlop;
	/**
	 * 按下點的X座標
	 */
	private int downX;
	/**
	 * 按下點的Y座標
	 */
	private int downY;
	/**
	 * 臨時儲存X座標
	 */
	private int tempX;
	/**
	 * 滑動類
	 */
	private Scroller mScroller;
	/**
	 * SildingFinishLayout的寬度
	 */
	private int viewWidth;
	/**
	 * 記錄是否正在滑動
	 */
	private boolean isSilding;
	
	private OnSildingFinishListener onSildingFinishListener;
	private boolean isFinish;
	

	public SildingFinishLayout(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public SildingFinishLayout(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);

		mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
		mScroller = new Scroller(context);
	}

	@Override
	protected void onLayout(boolean changed, int l, int t, int r, int b) {
		super.onLayout(changed, l, t, r, b);
		if (changed) {
			// 獲取SildingFinishLayout所在佈局的父佈局
			mParentView = (ViewGroup) this.getParent();
			viewWidth = this.getWidth();
		}
	}

	/**
	 * 設定OnSildingFinishListener, 在onSildingFinish()方法中finish Activity
	 * 
	 * @param onSildingFinishListener
	 */
	public void setOnSildingFinishListener(
			OnSildingFinishListener onSildingFinishListener) {
		this.onSildingFinishListener = onSildingFinishListener;
	}

	/**
	 * 設定Touch的View
	 * 
	 * @param touchView
	 */
	public void setTouchView(View touchView) {
		this.touchView = touchView;
		touchView.setOnTouchListener(this);
	}

	public View getTouchView() {
		return touchView;
	}

	/**
	 * 滾動出界面
	 */
	private void scrollRight() {
		final int delta = (viewWidth + mParentView.getScrollX());
		// 呼叫startScroll方法來設定一些滾動的引數,我們在computeScroll()方法中呼叫scrollTo來滾動item
		mScroller.startScroll(mParentView.getScrollX(), 0, -delta + 1, 0,
				Math.abs(delta));
		postInvalidate();
	}

	/**
	 * 滾動到起始位置
	 */
	private void scrollOrigin() {
		int delta = mParentView.getScrollX();
		mScroller.startScroll(mParentView.getScrollX(), 0, -delta, 0,
				Math.abs(delta));
		postInvalidate();
	}

	/**
	 * touch的View是否是AbsListView, 例如ListView, GridView等其子類
	 * 
	 * @return
	 */
	private boolean isTouchOnAbsListView() {
		return touchView instanceof AbsListView ? true : false;
	}

	/**
	 * touch的view是否是ScrollView或者其子類
	 * 
	 * @return
	 */
	private boolean isTouchOnScrollView() {
		return touchView instanceof ScrollView ? true : false;
	}

	@Override
	public boolean onTouch(View v, MotionEvent event) {
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			downX = tempX = (int) event.getRawX();
			downY = (int) event.getRawY();
			break;
		case MotionEvent.ACTION_MOVE:
			int moveX = (int) event.getRawX();
			int deltaX = tempX - moveX;
			tempX = moveX;
			if (Math.abs(moveX - downX) > mTouchSlop
					&& Math.abs((int) event.getRawY() - downY) < mTouchSlop) {
				isSilding = true;

				// 若touchView是AbsListView,
				// 則當手指滑動,取消item的點選事件,不然我們滑動也伴隨著item點選事件的發生
				if (isTouchOnAbsListView()) {
					MotionEvent cancelEvent = MotionEvent.obtain(event);
					cancelEvent
							.setAction(MotionEvent.ACTION_CANCEL
									| (event.getActionIndex() << MotionEvent.ACTION_POINTER_INDEX_SHIFT));
					v.onTouchEvent(cancelEvent);
				}

			}

			if (moveX - downX >= 0 && isSilding) {
				mParentView.scrollBy(deltaX, 0);

				// 遮蔽在滑動過程中ListView ScrollView等自己的滑動事件
				if (isTouchOnScrollView() || isTouchOnAbsListView()) {
					return true;
				}
			}
			break;
		case MotionEvent.ACTION_UP:
			isSilding = false;
			if (mParentView.getScrollX() <= -viewWidth / 2) {
				isFinish = true;
				scrollRight();
			} else {
				scrollOrigin();
				isFinish = false;
			}
			break;
		}

		// 假如touch的view是AbsListView或者ScrollView 我們處理完上面自己的邏輯之後
		// 再交給AbsListView, ScrollView自己處理其自己的邏輯
		if (isTouchOnScrollView() || isTouchOnAbsListView()) {
			return v.onTouchEvent(event);
		}

		// 其他的情況直接返回true
		return true;
	}

	@Override
	public void computeScroll() {
		// 呼叫startScroll的時候scroller.computeScrollOffset()返回true,
		if (mScroller.computeScrollOffset()) {
			mParentView.scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
			postInvalidate();

			if (mScroller.isFinished()) {

				if (onSildingFinishListener != null && isFinish) {
					onSildingFinishListener.onSildingFinish();
				}
			}
		}
	}
	

	public interface OnSildingFinishListener {
		public void onSildingFinish();
	}

}

我們在onLayout()方法中利用getParent()方法獲取該佈局的父佈局和獲取其控制元件的寬度,主要是為之後的實現做準備工作。

我們的滑動邏輯主要是利用View的scrollBy() 方法, scrollTo()方法和Scroller類來實現的,當手指拖動檢視的時候,我們監聽手指在螢幕上滑動的距離利用View的scrollBy() 方法使得View隨著手指的滑動而滑動,而當手指離開螢幕,我們在根據邏輯使用Scroller類startScroll()方法設定滑動的引數,然後再根據View的scrollTo進行滾動。

對於View的滑動,存在一些Touch事件消費的處理等問題,因此我們需要對View的整個Touch事件很熟悉 ,最主要的就是Activity裡面有一些ListView、 GridView、ScrollView等控制元件了, 假如我們Activity裡面存在ListView、GridView等控制元件的話,我們對Activity的最外層佈局進行滾動根本就無效果,因為Touch事件被ListView、GridView等控制元件消費了,所以Activity的最外層佈局根本得不到Touch事件,也就實現不了Touch邏輯了,所以為了解決此Touch事件問題我提供了setTouchView(View touchView) 方法,這個方法是將Touch事件動態的設定到到View上面,所以針對上面的問題,我們將OnTouchListener直接設定到ListView、GridView上面,這樣子就避免了Activity的最外層接受不到Touch事件的問題了

接下來看onTouch()方法

首先我們在ACTION_DOWN記錄按下點的X,Y座標

然後在ACTION_MOVE中判斷,如果我們在水平方向滑動的距離大於mTouchSlop並且在豎直方向滑動的距離小於mTouchSlop,表示Activity處於滑動狀態,我們判斷如果touchView是ListView、GridView或者其子類的時候,因為我們手指在ListView、GridView上面,伴隨著item的點選事件的發生,所以我們對touchView設定ACTION_CANCEL來取消item的點選事件,然後對該佈局的父佈局呼叫scrollBy()進行滾動,並且如果TouchView是AbsListView或者ScrollView直接返回true,來取消AbsListView或者ScrollView本身的ACTION_MOVE事件,最直觀的感受就是我們在滑動Activity的時候,禁止AbsListView或者ScrollView的上下滑動

最後在ACTION_UP中判斷如果手指滑動的距離大於控制元件長度的二分之一,表示將Activity滑出介面,否則滑動到起始位置,我們利用Scroller類的startScroll()方法設定好開始位置,滑動距離和時間,然後呼叫postInvalidate()重新整理介面,之後就到computeScroll()方法中,我們利用scrollTo()方法對該佈局的父佈局進行滾動,滾動結束之後,我們判斷介面是否滑出介面,如果是就呼叫OnSildingFinishListener介面的onSildingFinish()方法,所以只要在onSildingFinish()方法中finish介面就行了

整個滑動佈局的程式碼就是這個樣子,接下來我們就來使用了,主介面Activity只有三個按鈕,分別跳轉到普通佈局的Activity,有ListView的Activity和有ScrollView的Activity中

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:orientation="vertical" >

    <Button
        android:id="@+id/normal_activity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="普通的Activity" />

    <Button
        android:id="@+id/absListview_activity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="有AbsListView的Activity" />

    <Button
        android:id="@+id/scrollview_activity"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="有ScrollView的Activity" />

</LinearLayout>

然後就是MainActivity的程式碼,根據ID例項化Button,然後為Button設定OnClickListener事件,不同的按鈕跳轉到不同的Activity,然後設定從右向左滑動的動畫,重寫onBackPressed()方法,當我們按下手機物理鍵盤的返回鍵,新增從左向右滑出的動畫

package com.example.slidingfinish;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.Button;

import com.example.slidingfinish.R;

public class MainActivity extends Activity implements OnClickListener {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		Button mButtonNormal = (Button) findViewById(R.id.normal_activity);
		mButtonNormal.setOnClickListener(this);

		Button mButtonAbs = (Button) findViewById(R.id.absListview_activity);
		mButtonAbs.setOnClickListener(this);

		Button mButtonScroll = (Button) findViewById(R.id.scrollview_activity);
		mButtonScroll.setOnClickListener(this);

	}

	@Override
	public void onClick(View v) {
		Intent mIntent = null;
		switch (v.getId()) {
		case R.id.normal_activity:
			mIntent = new Intent(MainActivity.this, NormalActivity.class);
			break;
		case R.id.absListview_activity:
			mIntent = new Intent(MainActivity.this, AbsActivity.class);
			break;
		case R.id.scrollview_activity:
			mIntent = new Intent(MainActivity.this, ScrollActivity.class);
			break;
		}

		startActivity(mIntent);
		overridePendingTransition(R.anim.base_slide_right_in, R.anim.base_slide_remain);
	}
	
	//Press the back button in mobile phone
	@Override
	public void onBackPressed() {
		super.onBackPressed();
		overridePendingTransition(0, R.anim.base_slide_right_out);
	}

}
在這裡我之貼出含有ListView的Activity的程式碼,先看佈局,我們自定義滑動佈局SildingFinishLayout應該放在XML的最頂層
<?xml version="1.0" encoding="UTF-8"?>
<com.example.view.SildingFinishLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/sildingFinishLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#556677" >

    <ListView
        android:id="@+id/listView"
        android:cacheColorHint="@android:color/transparent"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </ListView>
    
    
</com.example.view.SildingFinishLayout>
package com.example.slidingfinish;

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import com.example.slidingfinish.R;
import com.example.view.SildingFinishLayout;
import com.example.view.SildingFinishLayout.OnSildingFinishListener;

public class AbsActivity extends Activity {
	private List<String> list = new ArrayList<String>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_abslistview);

		for (int i = 0; i <= 30; i++) {
			list.add("測試資料" + i);
		}

		ListView mListView = (ListView) findViewById(R.id.listView);
		ArrayAdapter<String> adapter = new ArrayAdapter<String>(
				AbsActivity.this, android.R.layout.simple_list_item_1, list);
		mListView.setAdapter(adapter);

		SildingFinishLayout mSildingFinishLayout = (SildingFinishLayout) findViewById(R.id.sildingFinishLayout);
		mSildingFinishLayout
				.setOnSildingFinishListener(new OnSildingFinishListener() {

					@Override
					public void onSildingFinish() {
						AbsActivity.this.finish();
					}
				});

		// touchView要設定到ListView上面
		mSildingFinishLayout.setTouchView(mListView);

		mListView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {

				startActivity(new Intent(AbsActivity.this, NormalActivity.class));
				overridePendingTransition(R.anim.base_slide_right_in,
						R.anim.base_slide_remain);
			}
		});
	}

	// Press the back button in mobile phone
	@Override
	public void onBackPressed() {
		super.onBackPressed();
		overridePendingTransition(0, R.anim.base_slide_right_out);
	}

}
利用ID找到SildingFinishLayout例項,利用setTouchView()方法設定touchView到ListView上面,然後呼叫setOnSildingFinishListener()設定OnSildingFinishListener,在onSildingFinish()中finish介面就可以啦。

在執行專案之前還有一個很重要的操作,也是之前我被卡到的問題,就是我們需要對Activity設定為透明,即設定主題android:theme="@android:style/Theme.Translucent" 

 <activity
            android:name=".AbsActivity"
            android:theme="@android:style/Theme.Translucent" >
        </activity>
        <activity
            android:name=".NormalActivity"
            android:theme="@android:style/Theme.Translucent" >
        </activity>
        <activity
            android:name=".ScrollActivity"
            android:theme="@android:style/Theme.Translucent" >
        </activity>
好了,現在我們可以執行專案看看效果啦

 



正是我們想要的效果,如果想要加入滑動切換介面的效果只需要三步就行了,首先將Activity佈局的最外層修改為SildingFinishLayout,然後在Activity裡面呼叫setTouchView()方法設定touchView,設定OnSildingFinishListener監聽在onSildingFinish()方法中finish介面,最後設定Activity的背景為透明(不是設定Activity佈局檔案的最頂層佈局背景顏色透明,這點要區分一下)是不是很方便呢?好了,今天的講解到這裡就結束了,有疑問的朋友請在下面留言,有興趣的朋友可以下載原始碼看看!

博主後面又改了下程式碼,寫了一個簡潔加強版的demo,程式碼更加簡潔了,也對裡面是ViewPager做了處理,並且加了邊界的陰影效果,也不必要呼叫setTouchView()來設定那個View響應滾動,對SildingFinishLayout裡面的子View是什麼沒有任何關係,如果大家想使用此效果的話,建議下載如下版本

相關推薦

Android 滑動銷燬finishActivity, 隨著手勢滑動滑動效果

今天給大家帶來一個向右滑動銷燬Activity的效果,Activtiy隨著手指的移動而移動,該效果在Android應用中還是比較少見的,在IOS中就比較常見了,例如“網易新聞” ,"美食傑" , "淘寶"等應用採用此效果,而Android應用中“知乎”採用的也是這種滑動切換A

Android插件化原理Activity插件化

ssa AS 直接 接收 hat ati 操作 運行 for Android深入四大組件系列 Android解析AMS系列 Android解析ClassLoader系列 前言 四大組件的插件化是插件化技術的核心知識點,而Activity插件化更是重中之重,Activity插

Android開發藝術探索筆記 Activity的生命週期和啟動模式(1)

Activity作為Android開發中最常用的一個元件,是Android開發人員必須熟悉且掌握的重要內容。同時Activity也是在面試中經常被問到的一個方向。因此,掌握Activity的重要性也不言而喻。這或許也是為什麼任大神會在《Android開發藝術探索

表達式從左求值所有運算符的優先級都一樣,僅包括+ - * /

col void spa enter 所有 char tchar putchar express #include <stdio.h> int main(void){ float a, b; char ch; printf(

Android進階3:Activity原始碼分析2 —— Activity啟動和銷燬流程8.0

上篇文章講述了app從啟動建立Activity呼叫onCreate,onStart, onResume方法,這篇文章講述一下Activity啟動的另一個切入點:startActivity方法,啟動Activity。 通過上一篇文章,我們總結一下: 1:A

Android中ScrollView如何監聽滑動距離總結

需求:想實現像美團中列表下拉後出現懸浮窗的效果。 思路:首先對ScrollView進行滑動監聽,然後在onScrollChanged()方法中獲取到滑動的Y值,接著進行相關操作即可。 實現步驟: 1、自定義MyScrollView (1)重寫onScrollChang

Android——View的事件體系View的滑動

主要介紹內容: View的基礎知識 View的位置引數 MotionEvent 和 TouchSlope VelocityTracker、GestureDetector 和 Scroller View的滑動 使用scrollTo/scrollBy 使用動

詳解:Android巢狀滑動機制 NestedScrolling

       從 Android 5.0 Lollipop 開始提供一套 API 來支援嵌入的滑動效果。同樣在最新的 Support V4 包中也提供了前向的相容。有了嵌入滑動機制,就能實現很多很複雜的滑動效果。在 Android Design Support 庫中非常總要

Android 端天氣預報APP的實現天氣顯示介面之上下滑動

最近參加了一個小比賽,選了天氣預報APP這個題目,最初選擇它,是想練練網路資料獲取和資料解析方面的知識,後來發現倒是學到了不少介面的東西。下面我來一步步講解一下我是怎麼完成的吧~ 首先,天氣預報最直觀的部分應該就是天氣顯示介面了,這裡,我想做成可以有上下滑動的

Android 滑動關閉頁面

前言: 用最簡單的例子來說明此問題。 1.在Activity中加上預設的佈局Layout 2.在自定義的Layout中實現右滑關閉Activity的邏輯  直接上程式碼! 自定義的佈局HFFinishRelativeLayout! package com.huofar.w

android 滑動關閉Activity

import android.content.Context; import android.view.MotionEvent; import android.view.VelocityTracker; import android.view.View; /** *

Android之Material Design之可重新整理的滑動列表RecyclerView

Material Design控制元件的簡單介紹:Toolbar — 加強版ActionBar,用setSupportActionBar()方法將Toolbar例項傳入 (app:showAsAction-用來指定按鈕的顯示位置)。DrawerLayout — 用於滑動選單。

Android 為ViewPager新增滑動指示器2

上一篇博文使用了開源庫PagerSlidingTabStrip來實現ViewPager的滑動指示器 其實Google官方的Android Support Design包也提供了TabLayout來實現滑動指示器的效果 TabLayout的使用方法也十分簡單,

Android的方法和屬性2

pin spinner 城市 android har lap ng- drawable -c 1.RadioButton(單選按鈕)   嵌入到RsdioGroup中實現單選效果   android:checkedButton="radio的id值"   int getC

說說Android應用的persistent屬性

bsp 是什麽 添加 mpat ltrace cleanup activity 異步 rip 1 啟動persistent應用 在Android系統中,有一種永久性應用。它們對應的AndroidManifest.xml文件裏,會將persistent屬性設為true

android入門 — 多線程

xtend 分享 調用 管理 ava 導致 ui線程 rec thread   android中的一些耗時操作,例如網絡請求,如果不能及時響應,就會導致主線程被阻塞,出現ANR,非常影響用戶體驗,所以一些耗時的操作,我們會想辦法放在子線程中去完成。   android的U

最詳細的 Android Toolbar 開發實踐總結

activity resource listener nba flat xmlns mat https ons 轉自:http://www.codeceo.com/article/android-toolbar-develop.html 過年前發了一篇介紹 Transluc

Android實現音樂播放器

simple ani call ket 打開文件 界面 方式 .cn 點擊 Graphical User Interface 本篇文章記錄了我實現Android簡單音樂播放器的過程,(一)中介紹了怎麽構建音樂播放器的前端頁面。首先大家看一下,界面最後是這樣的(界面有

【金陽光測試】基於控件核心技術探討---Android自己主動化系列2---2013年5月

進程 實用 版本 信號 監聽 dialog otto 設計 核心技術 第一講分享了下安卓自己主動化一些概況和一些自己主動化框架現狀和技術可以解決什麽樣的問題。這次課就深入到android世界裏面。遨遊、翺翔。深入了解自己主動化測試核心技術。

android application類簡單介紹

cati theme text color raw sdn water bsp public 每次應用程序執行時。應用程序的application類保持實例化的狀態。通過擴展applicaiton類,能夠完畢下面3項工作: 1.對android執行時廣播的應用程序