android 蒙版图片带拖动_推荐一个好用小巧的Android引导蒙版(浮层)库
更新:目前該庫已更新v2.0版本,修改了調用api,詳細使用可以看:可能是最好用的Android引導層庫
前言
每當一個項目開發一個新功能,總會想辦法及時讓用戶得知有這樣一個新功能,這時通常會采用引導頁或者蒙版(浮層)的方式提心用戶,這里有需要關注的新內容。
遇到這種需求,最簡單的想法就是將引導的布局直接寫在對應的頁面中,在首次打開時顯示,之后隱藏。但是用這種做法來顯示只會出現一次的布局,顯然有些浪費資源。而且很low,完全體現不出OOP的編程思想。我們的項目中原來使用的是:http://www.jianshu.com/p/5aa96683d0dc
可以看到這是一個非常好的思路,通過DecorView來添加引導層,引導層的相關代碼就可以從activity中抽離出來。高亮則是通過畫筆的setXfermode來實現。作者也進行了一定的封裝,使用的效果也挺好,但是我始終對調用的方法感覺不舒服:
每次使用時要判斷是否顯示過
if(NewbieGuideManager.isNeverShowed(this, NewbieGuideManager.TYPE_COLLECT)) {
new NewbieGuideManager(this, NewbieGuideManager.TYPE_COLLECT).addView
(mCollect, HoleBean.TYPE_CIRCLE).addView(mTitleTv, HoleBean
.TYPE_RECTANGLE).show();
}
通過下列方法顯示出引導層
new NewbieGuideManager(MainActivity.this,
NewbieGuideManager.TYPE_LIST).addView(view
.getChildAt(0).findViewById(R.id.logo), HoleBean
.TYPE_RECTANGLE).show();
這里還涉及到一個常量:NewbieGuideManager.TYPE_LIST,需要在manager類中定義,并且設置對應的布局:
mNewbieGuide.setEveryWhereTouchable(false).addIndicateImg(R.drawable.left_arrow, ScreenUtils.dpToPx(mActivity,
60), ScreenUtils.dpToPx(mActivity, 110)).addMsgAndKnowTv("這個listview滾動到item6后出現新手引導浮層,\n只有點擊我知道啦才會想消失",
-ScreenUtils.dpToPx(mActivity, 250)).show();
并且每增加一種引導浮層就要重復上述3步的過程。
優化的NewbieGuide
由于非常介意上述的調用方式,于是我抽空在上述的思路上自己實現一個小巧的庫,主要對調用方式進行了封裝,通過鏈式調用,一行代碼就可以實現引導層的實現。
Github:https://github.com/huburt-Hu/NewbieGuide
導入
先來看下如何導入項目中:
項目的build.gradle添加
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
module的build.gradle添加
dependencies {
compile 'com.github.huburt-Hu:NewbieGuide:v1.0.2'
}
使用
使用的話非常方便,在需要引導層的地方添加如下代碼:
NewbieGuide.with(this)//傳入activity
.setLabel("guide1")//設置引導層標示,用于區分不同引導層,必傳!否則報錯
.addHighLight(view, HighLight.Type.RECTANGLE)//添加需要高亮的view
.setLayoutRes(R.layout.view_guide)//自定義的提示layout,不要添加背景色,引導層背景色通過setBackgroundColor()設置
.show();//顯示引導層
setLabel(String label)方法需要傳入一個當前引導層的標示,用于sp緩存當前引導層是否已經顯示過,因此是一個必須的參數,忘了設置的話會拋出異常!
addHighLight()方法有三個重載,第一個參數是需要高亮的view(通常是通過findViewById找到的view),第二個參數是高亮的類型,目前有四種:矩形,圓形,橢圓,圓角矩形(如果選擇圓角矩形的話,調用重載3個參數的方法,第三個參數是圓角的dp值),默認的話是矩形即只有一個參數的重載。
setLayoutRes(int resId,int... id)該方法第一個參數傳入xml的布局,可以任意編輯,如提示的文字,顏色,位置,圖片等,皆有你來自定義。第二個參數是可變參數,傳入該布局內需要點擊消失引導層的view的id。之所以用這種方式是因為通過代碼來調整視圖非常麻煩,無法直接看到效果,我在使用中經常要部署好多次才會確定最終位置,遠沒有layout.xml來實現布局方便。
效果
效果
當然,這只是最簡單的實現效果,具體要如何的界面都可以由你來自定義layout,并通過setLayoutRes()方法傳入即可。
更多配置
Controller controller = NewbieGuide.with(this)
.setOnGuideChangedListener(new OnGuideChangedListener() {//設置監聽
@Override
public void onShowed(Controller controller) {
//引導層顯示
}
@Override
public void onRemoved(Controller controller) {
//引導層消失
}
})
.setBackgroundColor(Color.BLACK)//設置引導層背景色,建議有透明度,默認背景色為:0xb2000000
.setEveryWhereCancelable(false)//設置點擊任何區域消失,默認為true
.setLayoutRes(R.layout.view_guide, R.id.textView)//自定義的提示layout,第二個可變參數為點擊隱藏引導層view的id
.alwaysShow(true)//是否每次都顯示引導層,默認false
.build();//構建引導層的控制器
controller.resetLabel("guide1");
controller.remove();//移除引導層
controller.show();//顯示引導層
實現原理
這個庫非常的小,總共只有5個類,一個接口,一個工具類。
高亮的實現是通過畫筆的setXfermode。即當兩個畫布上都繪制了圖片是,可以控制最終顯示的樣式,有取重疊部分,有去除重疊部分的等等,總共有16中規則,具體下圖:
setXfermode屬性
我所使用的是clear屬性,即先通過canvas.drawColor(mBackgroundColor);繪制背景色,然后通過設置了clear屬性的畫筆
PorterDuffXfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
mPaint.setXfermode(xfermode);
鏤空出需要高亮的view。
view在屏幕的位置可以通過下述方法獲取:
public RectF getRectF() {
RectF rectF = new RectF();
if (mHole != null) {
int[] location = new int[2];
mHole.getLocationOnScreen(location);
rectF.left = location[0];
rectF.top = location[1];
rectF.right = location[0] + mHole.getWidth();
rectF.bottom = location[1] + mHole.getHeight();
}
return rectF;
}
mHole就是之前傳入的需要高亮的view。
余下就是調用的封裝了,使用了建造者模式來保證鏈式調用,有興趣的可以clone代碼看下,也用不了多少時間。
后記
這個庫也是我第一個公開的庫,目前僅僅實現了基本的功能,后續也會不斷維護和升級。有什么疑問或者建議,或者需要補充的需求都可以回復,留言,感覺各位閱讀我的文章~
總結
以上是生活随笔為你收集整理的android 蒙版图片带拖动_推荐一个好用小巧的Android引导蒙版(浮层)库的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我有1万块钱 想要全能笔记本:该买谁?
- 下一篇: vue打包代码反编译_Android逆向