【移動應(yīng)用開發(fā)技術(shù)】Android實現(xiàn)類似3D Touch菜單功能_第1頁
【移動應(yīng)用開發(fā)技術(shù)】Android實現(xiàn)類似3D Touch菜單功能_第2頁
【移動應(yīng)用開發(fā)技術(shù)】Android實現(xiàn)類似3D Touch菜單功能_第3頁
【移動應(yīng)用開發(fā)技術(shù)】Android實現(xiàn)類似3D Touch菜單功能_第4頁
免費預(yù)覽已結(jié)束,剩余1頁可下載查看

付費下載

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

【移動應(yīng)用開發(fā)技術(shù)】Android實現(xiàn)類似3DTouch菜單功能

在下給大家分享一下Android實現(xiàn)類似3DTouch菜單功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!前言在開發(fā)中,我們經(jīng)常遇到需要菜單功能的實現(xiàn),我們經(jīng)常會參考其他人的優(yōu)秀設(shè)計。比如3DTouch菜單,作為iphone6和iphone6s上引人注目的新功能?,F(xiàn)在,我們希望盡力來模仿這種菜單設(shè)計,盡力,因為系統(tǒng)的差異,會導(dǎo)致很多東西實現(xiàn)起來有難度。思路想要盡力模仿這種菜單,經(jīng)過分析,我覺得主要實現(xiàn)以下幾個點:1)菜單的出現(xiàn)方式,在ios上,方式是用戶用手指用力按下,然而在Android上,受限于硬件,我們無法捕捉用力按壓這種動作,所以,我改用另一種比較次的方式,長按彈出,捕捉手指長按動作。2)菜單的界面上,需要處理背景模糊效果。3)菜單的觸摸事件處理,我們看到,手指長按之后,菜單出現(xiàn),這時候手指不離開屏幕,滑動到菜單某個選項,再抬起,這時候這個選項會相應(yīng)。實現(xiàn)背景模糊處理經(jīng)過一番調(diào)研,除了調(diào)用github上面大神的各種繪圖效果庫,我們想要自己實現(xiàn)大概有兩個思路。RenderScript方案RenderScript是由Android3.0引入,用來在Android上編寫高性能代碼的一種語言。優(yōu)點:使用方便,Android官方API自帶,而且性能處理效果極好,缺點:需要API17以上。使用非常簡單,我們只需要獲取RenderScript的實例,傳入模糊圖像需要的參數(shù)@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)

public

Bitmap

getRenderScriptBitmap(Context

context,

int

radius,

Bitmap

bitmapOriginal)

{

RenderScript

rs

=

RenderScript.create(context);

final

Allocation

input

=

Allocation.createFromBitmap(rs,

bitmapOriginal);

final

Allocation

output

=

Allocation.createTyped(rs,

input.getType());

final

ScriptIntrinsicBlur

script

=

ScriptIntrinsicBlur.create(rs,

Element.U8_4(rs));

script.setRadius(radius);

script.setInput(input);

script.forEach(output);

output.copyTo(bitmapOriginal);

rs.destroy();

return

bitmapOriginal;

}Java代碼層實現(xiàn)方案通過java層代碼也可以實現(xiàn)圖像的模糊處理,github大神已經(jīng)為我們實現(xiàn)了這種圖像算法。通過FastBlur算法實現(xiàn)圖片模糊,沒有版本兼容問題,但是如果我們需要模糊的圖像不小的時候,我們會發(fā)現(xiàn)模糊圖像需要的時間遠遠超過了我們能夠接受的范圍,如果加載大圖的話,那情況就更加糟糕了。一個比較好的處理方式是,在圖片進行模糊處理之前,先對圖像進行壓縮,在圖片模糊處理完畢之后,再按照原大小放大,這樣就能有效降低模糊處理的耗時。這里我們做一個版本判斷if

(android.os.Build.VERSION.SDK_INT

>=

Build.VERSION_CODES.JELLY_BEAN_MR1)

{

mIBlurry

=

BlurryFactory.createRenderScript();

}

else

{

mIBlurry

=

BlurryFactory.createFastBlur();

}觸摸事件的處理先來說說模糊層如何出現(xiàn),肯定是要實現(xiàn)一個全屏效果,關(guān)于全屏效果,我們可以通過Dialog,懸浮窗,透明的Activity,或者在DectorView中插入覆蓋父布局的視圖,這四種方式都可以實現(xiàn)全屏效果,這里,我們選用在DectorView中插入視圖的方式來實現(xiàn)。如何實現(xiàn)呢?

/**

*

掛載到某個Activity的最頂層

*

@param

activity

*/

private

void

attachActivity(Activity

activity)

{

ViewParent

parent

=

getParent();

if(parent

!=

null

&&

parent

instanceof

ViewGroup)

{

ViewGroup

parentView

=

(ViewGroup)

parent;

parentView.removeView(this);

}

FrameLayout

decor

=

(FrameLayout)activity.getWindow().getDecorView();

FrameLayout.LayoutParams

lp

=

new

FrameLayout.LayoutParams(

FrameLayout.LayoutParams.MATCH_PARENT,

FrameLayout.LayoutParams.MATCH_PARENT);

decor.addView(this,

lp);

}前面提到,手指長按,在菜單彈出之后,我們在手指不抬起的情況下,可以選擇菜單選項。這樣聽起來可能有些難以理解,我們都看過很多大神寫的View的觸摸事件解析,也有自己去研讀源碼,都對觸摸事件傳遞有一定的了解。一般情況下,當(dāng)我們長按界面里的某個View,之后在我們手指抬起之前,所有的觸摸事件都會交由這個View來處理,也就是targetView(當(dāng)某個View消費了觸摸事件,那么它就會被設(shè)置為targetView,并且接收接下來傳遞的觸摸事件)。那么我們?nèi)绾卧谑种覆惶鸬那闆r下,讓剛剛出現(xiàn)模糊層視圖來接管接下來的手指滑動,也就是ACTION_MOVE和ACTION_UP事件呢?經(jīng)常一番思考,我想到了一種比較委婉的方式…我們都知道手指抬起的時候,DecorView以及其子視圖都會接收到一個ACTION_UP的觸摸事件,這個事件會告訴DecorView,這個手指觸摸系列動作已經(jīng)結(jié)束,那么方法來了,我們并不需要手指真的抬起來,只需要模擬一個手指抬起的動作,也就是自己發(fā)送一個ACTION_UP事件,就可以讓DecorView接收到ACTION_UP事件,然后重新尋找targetView,也就是新出現(xiàn)的模糊層視圖,這時候我們再模擬發(fā)送一個ACTION_DOWN事件。

/**

*

轉(zhuǎn)移觸摸事件

*/

private

void

transferTouchEvent(final

Activity

activity)

{

postDelayed(new

Runnable()

{

@Override

public

void

run()

{

activity.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),

SystemClock.uptimeMillis(),

MotionEvent.ACTION_UP,

0f,

0f,

0));

activity.getWindow().getDecorView().dispatchTouchEvent(MotionEvent.obtain(SystemClock

.uptimeMillis(),

SystemClock.uptimeMil

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論