91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Activity滑動返回操作,像iOS的UINavigationController、知乎的Android版那樣

發布時間:2020-06-07 23:59:54 來源:網絡 閱讀:1852 作者:NashLegend 欄目:移動開發


這里只介紹原理,更詳細的實現代碼地址在此 :https://github.com/NashLegend/SwipetoFinishActivity




這是Activity滑動的示意圖

Activity滑動返回操作,像iOS的UINavigationController、知乎的Android版那樣

像fragment一樣,activity本身是沒有滑動的方法的,但是我們可以制造一個正在滑動activity的假象,使得這個activity看起來正在被手指滑動。其原理其實很簡單,我們滑動的其實是activity里面的可見view元素,同時我們將activity設置為透明的,這樣當activity中可見的view元素滑過的時候,由于activity的底部是透明的,我們就可以在滑動過程中看到下面的activity,這樣看起來就是在滑動activity。所以activity滑動效果分兩步,1,設置activity透明,2,滑動view。

  1. 設置透明: 建立一個Style,在Style里面添加下面兩行,并將這個style應用在activity上就可以了

    <item name="android:windowBackground">@*android:color/transparent</item>
    <item name="android:windowIsTranslucent">true</item>
  2. 滑動view:先看看activity的層次結構:如下圖,我們用的activity的xml的根view(在下圖中是倒數第二層的FrameLayout)并不是activity的根view,在它上面還有一個父view,id是android.R.id.content,再向上一層,還有一個view,它是一個LinearLayout,它除了放置我們創建的view之外,還放置我們的xml之外的一些東西比如放ActionBar或者標題欄(在下圖是左邊那一分枝)。而再往上一級,就到了activity的根view——DecorView。

     Activity滑動返回操作,像iOS的UINavigationController、知乎的Android版那樣

    要做到像iOS那樣,可以滑動整個activity,只滑動我們在xml里面創建的view顯然是不對的,因為我們還有標題欄、ActionBar什么的,所以我們要滑動的應該是DecorView或者倒數第二層的那個view。

    而要滑動view的話,我們要重寫其父窗口的onInterceptTouchEvent以及onTouchEvent【當然使用setOnTouchListener也可以,但是如果有一個子view消費了onTouch事件,那么也就接收不到了】,但是窗口的創建過程不是我們能控制的,DecorView的創建都不是我們能干預的。解決辦法就是,我們自己創建一個SwipeLayout,然后人為地插入到頂層view中,放置在DecorView和其下面的LinearLayout中間,隨著手指的滑動,不斷改變SwipeLayout的子view——曾經是DecorView的子view——的位置,這樣我們就可以控制我們的滑動啦。

    我們在自定義的SwipeLayout中添加一個replaceLayer,這個方法執行將SwipeLayout插入頂層的代碼,并在activity的onPostCreate()方法中調用swipeLayout.replaceLaye()替換我們的SwipeLayout,代碼如下:

    public void replaceLayer(Activity activity) {
        mActivity = activity;
        screenWidth = getScreenWidth(activity);
        setClickable(true);
        ViewGroup root = (ViewGroup) activity.getWindow().getDecorView();
        content = root.getChildAt(0);
        ViewGroup.LayoutParams params = content.getLayoutParams();
        ViewGroup.LayoutParams params2 = new ViewGroup.LayoutParams(-1, -1);
        root.removeView(content);
        this.addView(content, params2);
        root.addView(this, params);
    }

然后我們把這些寫成一個SwipeActivity,其它activity只要繼承這個SwipeActivity并設置上第一步中的style就可以實現滑動返回功能, 這里只說滑動activity的原理,剩下的都是控制滑動以及關閉Activity什么的事了,詳見代碼在這里:  摸我


BTW,滑動Fragment原理其實一樣,只不過更加簡單,省去替換那一步,Fragment在view樹中就是它onCreateView返回的元素,用fragment.getView可以取得,滑動fragment其實滑動的就是fragment.getView。只要把滑動方法寫在它父view中就可以了。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

九龙县| 眉山市| 泊头市| 武汉市| 澜沧| 南木林县| 通山县| 上高县| 景谷| 溧阳市| 蕉岭县| 宁国市| 仲巴县| 敖汉旗| 揭阳市| 镇坪县| 辰溪县| 陇西县| 镇江市| 九龙坡区| 白河县| 禄劝| 固原市| 库尔勒市| 丹东市| 永新县| 安塞县| 眉山市| 黄梅县| 繁昌县| 汤阴县| 江山市| 高邮市| 抚州市| 亳州市| 贡觉县| 扶沟县| 余姚市| 南溪县| 乌鲁木齐县| 长治市|