多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > 綜合技術(shù) > [置頂] Android L限制Ripple水波紋范圍大小

[置頂] Android L限制Ripple水波紋范圍大小

來源:程序員人生   發(fā)布時(shí)間:2017-03-15 08:54:54 閱讀次數(shù):6287次

Meterial Design

Ripple簡介

Android 5.0以后google推出了Material Design,Botton默許的觸摸反饋會(huì)有水波紋漣漪效果。而這類水波紋的效果實(shí)現(xiàn)主要依賴于RippleDrawable。

以下會(huì)介紹Ripple的基本使用及關(guān)于控制水波紋范圍的3種處理方法,僅作點(diǎn)明思路及學(xué)習(xí)筆記不作具體實(shí)現(xiàn)。

基本使用

該效果通常以background的情勢顯現(xiàn),在XML中可以援用以下兩個(gè)系統(tǒng)自帶屬性:
- android:background=”?android:attr/selectableItemBackground” 有邊界波紋
- android:background=”?android:attr/··” 超越邊界波紋。該波紋由父布局繪制及限制邊界(API 21提供)
selectableItemBackground為例看下系統(tǒng)屬性的實(shí)現(xiàn)原理,發(fā)現(xiàn)該屬性的定義終究指向<item name="selectableItemBackground">@drawable/item_background_material</item>,
查看該Drawable文件內(nèi)容為:

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?attr/colorControlHighlight">
    <item android:id="@id/mask">
        <color android:color="@color/white" />
    </item>
</ripple>

selectableItemBackgroundBorderless所對(duì)應(yīng)Drawable內(nèi)容為:

<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="?attr/colorControlHighlight" />

RippleDrawable

XML控制

特點(diǎn):簡單,用于固定的view的處理,但靈活性不高。

目前網(wǎng)絡(luò)上的資料偏向于如何在xml的item下做文章,如在ripple中添加shape來限制范圍,驗(yàn)證效果反而有各種小坑(誰驗(yàn)誰知道)。卻不知官方早已提供解決方案。

根據(jù)官方對(duì)RippleDrawable的說明文檔,ripple的xml標(biāo)簽支持兩個(gè)屬性,分別是color色調(diào)和radius波紋半徑。故我們?cè)谑褂脮r(shí)只需要新建ripple并以`android:background的情勢調(diào)用便可.

<ripple xmlns:android="http://schemas.android.com/apk/res/android"
android:color="?android:attr/colorControlHighlight"
android:radius="@dimen/ripple_radius" />

自定義RippleDrawable

特點(diǎn):可以動(dòng)態(tài)控制,靈活性超級(jí)高,但對(duì)應(yīng)的處理復(fù)雜度和難度也較高。

設(shè)置水波紋點(diǎn)擊效果的本質(zhì)其實(shí)就是設(shè)置1個(gè)background,最為靈活的方法固然是自定義ripple,然后對(duì)目標(biāo)View直接setBackground便可.

RippleDrawable繼承于Drawable

java.lang.Object
? android.graphics.drawable.Drawable
? android.graphics.drawable.LayerDrawable
? android.graphics.drawable.RippleDrawable

自定義時(shí)可以繼承RippleDrawable也能夠直接繼承Drawable,二者的本質(zhì)分別是實(shí)現(xiàn)setRadius()和實(shí)現(xiàn)setHotspotBounds(),殊途同歸,都可以到達(dá)動(dòng)態(tài)限制波紋大小的效果。系統(tǒng)的虛擬鍵NavigationBar就是使用的后者。

折衷方案

特點(diǎn):簡單,靈活適中,易上手

selectableItemBackgroundBorderless超越邊界范圍為基礎(chǔ),以setHotspotBounds()的方式動(dòng)態(tài)控制其波紋范圍。

以下提供的是個(gè)簡易工具demo,調(diào)用時(shí)傳入對(duì)應(yīng)的viewxxx.setBackground(RippleUtils. getRippleDrawable(context, targetView)),也能夠自己定義增加1個(gè)控制ripple范圍的方法:

/**
 * Created by vito on 16⑴1⑴.
 */
public class RippleUtils {
    private static RippleDrawable mRipple;
    private static Drawable mTileBackground;

    private static Drawable newTileBackground(Context context) {
        final int[] attrs = new int[]{android.R.attr.selectableItemBackgroundBorderless};
        final TypedArray ta = context.obtainStyledAttributes(attrs);
        final Drawable d = ta.getDrawable(0);
        ta.recycle();
        return d;
    }

    private static void setRipple(RippleDrawable tileBackground, View v) {
        mRipple = tileBackground;
        updateRippleSize(v);
    }

    //以view的中心為圓心,寬的1/4為半徑的ripple范圍
    private static void updateRippleSize(View v) {
        // center the touch feedback on the center of the icon, and dial it down a bit
        if (v.getWidth() != 0) {
            final int cx = v.getWidth() / 2;
            final int cy = v.getHeight() / 2;
            final int rad = (int) (v.getWidth() * .25f);
            Log.d("ripple", "updateRippleSize: rad=" + rad);
            mRipple.setHotspotBounds(cx - rad, cy - rad, cx + rad, cy + rad);
        } else {
            // TODO: 17⑴⑼  
        }
    }

    //對(duì)外接口
    public static RippleDrawable getRippleDrawable(Context context, View view) {
        mTileBackground = newTileBackground(context);
        if (mTileBackground instanceof RippleDrawable) {
            setRipple((RippleDrawable) mTileBackground, view);
        }
        return mRipple;
    }
}
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产a国产片色老头 | 日本高清www午夜视频 | 国产成人亚洲毛片 | 欧美a在线播放 | 亚洲黄a | 最近中文字幕无吗高清视频 | 亚洲成人免费看 | 一级做a爰全过程免费视频毛片 | 亚洲欧美一区二区三区蜜芽 | 久操网在线| 国产jizzjizz免费看麻豆 | 国产欧美日本在线 | а中文在线天堂 | 欧美一区二区三区不卡视频 | 久久久xxxx| 成年视频xxxxx在线网站 | 国产亚洲精品一区二区在线观看 | 波多野结衣视频在线观看地址免费 | 欧美18毛片免费看 | 国产免费一区2区3区4区 | 欧美另类久久久精品 | 午夜视频你懂的 | 美女一级黄色片 | 欧美性美| 国产一区二区不卡 | 国产毛片在线视频 | 国产jizz中国jizz免费看 | 亚洲国产成人久久三区 | 精品一区二区三区四区乱码90 | 麻豆福利在线观看 | 日韩欧美一区二区三区中文精品 | 夜夜躁狠狠躁日日躁2021 | 黄色天堂网站 | 老师邪恶影院a啦啦啦影院 老司机av | 国产亚洲欧美ai在线看片 | 性欧美高清极品xx | 国产午夜精品片一区二区三区 | 久久久久久亚洲精品 | 日本午夜大片a在线观看 | 亚洲防屏蔽一区二区 | 亚洲黄网址 |