欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android自定義ViewGroup打造各種風(fēng)格的SlidingMenu

 更新時(shí)間:2016年02月22日 10:10:18   作者:阿拉燈神燈  
這篇文章主要介紹了Android自定義ViewGroup打造各種風(fēng)格的SlidingMenu的相關(guān)資料,需要的朋友可以參考下

上篇給大家介紹QQ5.0側(cè)滑菜單的視頻課程,對于側(cè)滑的時(shí)的動畫效果的實(shí)現(xiàn)有了新的認(rèn)識,似乎打通了任督二脈,目前可以實(shí)現(xiàn)任意效果的側(cè)滑菜單了,感謝鴻洋大大!!

用的是HorizontalScrollView來實(shí)現(xiàn)的側(cè)滑菜單功能,HorizontalScrollView的好處是為我們解決了滑動功能,處理了滑動沖突問題,讓我們使用起來非常方便,但是滑動和沖突處理都是android中的難點(diǎn),是我們應(yīng)該掌握的知識點(diǎn),掌握了這些,我們可以不依賴于系統(tǒng)的API,隨心所欲打造我們想要的效果,因此這篇文章我將直接自定義ViewGroup來實(shí)現(xiàn)側(cè)滑菜單功能

首先我們先來看一看效果圖,第一個(gè)效果圖是一個(gè)最普通的側(cè)滑菜單,我們一會兒會先做出這種側(cè)滑菜單,然后再在此基礎(chǔ)上實(shí)現(xiàn)另外兩個(gè)效果

第一種

這里寫圖片描述

第二種

這里寫圖片描述

第三種

這里寫圖片描述

實(shí)現(xiàn)第一種側(cè)滑菜單,繼承自ViewGroup

繼承自ViewGroup需要我們自己來測量,布局,實(shí)現(xiàn)滑動的效果,處理滑動沖突,這些都是一些新手無從下手的知識點(diǎn),希望看了這篇文章后可以對大家有一個(gè)幫助

自定義ViewGroup的一般思路是重寫onMeasure方法,在onMeasure方法中調(diào)用measureChild來測量子View,然后調(diào)用setMeasuredDimension來測量自己的大小。然后重寫onLayout方法,在onLayout中調(diào)用子View的layout方法來確定子View的位置,下面我們先來做好這兩件工作

這里寫圖片描述

初始時(shí)候我們的Content應(yīng)該是顯示在屏幕中的,而Menu應(yīng)該是顯示在屏幕外的。當(dāng)Menu打開時(shí),應(yīng)該是這種樣子的

這里寫圖片描述 

mMenuRightPadding是Menu距屏幕右側(cè)的一個(gè)距離,因?yàn)槲覀僊enu打開后,Content還是會留一部分,而不是完全隱藏的

public class MySlidingMenu extends ViewGroup {
public MySlidingMenu(Context context) {
this(context, null, 0);
}
public MySlidingMenu(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MySlidingMenu(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
DisplayMetrics metrics = new DisplayMetrics();
WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
wm.getDefaultDisplay().getMetrics(metrics);
//獲取屏幕的寬和高
mScreenWidth = metrics.widthPixels;
mScreenHeight = metrics.heightPixels; 
//設(shè)置Menu距離屏幕右側(cè)的距離,convertToDp是將代碼中的100轉(zhuǎn)換成100dp
mMenuRightPadding = convertToDp(context,100); 
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//拿到Menu,Menu是第0個(gè)孩子
mMenu = (ViewGroup) getChildAt(0);
//拿到Content,Content是第1個(gè)孩子
mContent = (ViewGroup) getChildAt(1);
//設(shè)置Menu的寬為屏幕的寬度減去Menu距離屏幕右側(cè)的距離
mMenuWidth = mMenu.getLayoutParams().width = mScreenWidth - mMenuRightPadding;
//設(shè)置Content的寬為屏幕的寬度
mContentWidth = mContent.getLayoutParams().width = mScreenWidth;
//測量Menu
measureChild(mMenu,widthMeasureSpec,heightMeasureSpec);
//測量Content
measureChild(mContent, widthMeasureSpec, heightMeasureSpec);
//測量自己,自己的寬度為Menu寬度加上Content寬度,高度為屏幕高度
setMeasuredDimension(mMenuWidth + mContentWidth, mScreenHeight);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
//擺放Menu的位置,根據(jù)上面圖可以確定上下左右的坐標(biāo)
mMenu.layout(-mMenuWidth, 0, 0, mScreenHeight);
//擺放Content的位置
mContent.layout(0, 0, mScreenWidth, mScreenHeight);
}

/**
* 將傳進(jìn)來的數(shù)轉(zhuǎn)化為dp
*/
private int convertToDp(Context context , int num){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,num,context.getResources().getDisplayMetrics());
}
}

目前我們的側(cè)滑菜單中的兩個(gè)子View的位置應(yīng)該是這個(gè)樣子

這里寫圖片描述 

接下來我們編寫xml布局文件

left_menu.xml 左側(cè)菜單的布局文件,是一個(gè)ListView

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/menu_listview"
android:layout_width="wrap_content"
android:divider="@null"
android:dividerHeight="0dp"
android:scrollbars="none"
android:layout_height="wrap_content">
</ListView>
</RelativeLayout>

其中ListView的Item布局為left_menu_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:gravity="center_vertical"
android:layout_height="match_parent">
<ImageView
android:id="@+id/menu_imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/menu_1"
android:padding="20dp"
/>
<TextView
android:id="@+id/menu_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="菜單1"
android:textColor="#000000"
android:textSize="20sp"
/>
</LinearLayout>

我們再來編寫內(nèi)容區(qū)域的布局文件 content.xml 其中有一個(gè)header,header中有一個(gè)ImageView,這個(gè)ImageView是menu的開關(guān),我們點(diǎn)擊他的時(shí)候可以自動開關(guān)menu,然后header下面也是一個(gè)listview

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="65dp"
android:background="#000000"
android:gravity="center_vertical"
android:orientation="horizontal"
>
<ImageView
android:id="@+id/menu_toggle"
android:layout_width="40dp"
android:layout_height="40dp"
android:src="@drawable/toggle"
android:paddingLeft="10dp"
/>
</LinearLayout>
<ListView
android:id="@+id/content_listview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:dividerHeight="0dp"
android:divider="@null"
android:scrollbars="none"
/>
</LinearLayout>

content的item的布局文件為 content_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:gravity="center_vertical"
android:background="#ffffff"
android:layout_height="match_parent">
<ImageView
android:id="@+id/content_imageview"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@drawable/content_1"
android:layout_margin="20dp"
/>
<TextView
android:id="@+id/content_textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Content - 1"
android:textColor="#000000"
android:textSize="20sp"/>
</LinearLayout>

在activity_main.xml中,我們將menu和content添加到我們的slidingMenu中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#aaaaaa"
>
<com.example.user.slidingmenu.MySlidingMenu
android:id="@+id/slidingmenu"
android:layout_width="wrap_content"
android:layout_height="match_parent"
>
<include
android:id="@+id/menu"
layout="@layout/left_menu"
/>
<include
android:id="@+id/content"
layout="@layout/content"
/>
</com.example.user.slidingmenu.MySlidingMenu>
</RelativeLayout>

現(xiàn)在應(yīng)該是這種效果

這里寫圖片描述 

左側(cè)菜單是隱藏在屏幕左側(cè)外部的,但是現(xiàn)在還不能滑動,如果想要實(shí)現(xiàn)滑動功能,我們可以使用View的scrollTo和scrollBy方法,這兩個(gè)方法的區(qū)別是scrollTo是直接將view移動到指定的位置,scrollBy是相對于當(dāng)前的位置移動一個(gè)偏移量,所以我們應(yīng)該重寫onTouchEvent方法,用來計(jì)算出當(dāng)前手指的一個(gè)偏移量,然后使用scrollBy方法一點(diǎn)一點(diǎn)的移動,就形成了一個(gè)可以跟隨手指移動的view的動畫效果了

在寫代碼之前,我們先掃清一下障礙,我們先來弄清楚這些坐標(biāo)是怎么回事

這里寫圖片描述
這里寫圖片描述
這里寫圖片描述

好了,把這些坐標(biāo)弄清楚后,我們就簡單多了,下面直接看onTouchEvent方法

@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction();
switch (action){
case MotionEvent.ACTION_DOWN:
mLastX = (int) event.getX();
mLastY = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
int currentX = (int) event.getX();
int currentY = (int) event.getY();
//拿到x方向的偏移量
int dx = currentX - mLastX;
if (dx < 0){//向左滑動
//邊界控制,如果Menu已經(jīng)完全顯示,再滑動的話
//Menu左側(cè)就會出現(xiàn)白邊了,進(jìn)行邊界控制
if (getScrollX() + Math.abs(dx) >= 0) {
//直接移動到(0,0)位置,不會出現(xiàn)白邊
scrollTo(0, 0);
} else {//Menu沒有完全顯示呢
//其實(shí)這里dx還是-dx,大家不用刻意去記
//大家可以先使用dx,然后運(yùn)行一下,發(fā)現(xiàn)
//移動的方向是相反的,那么果斷這里加個(gè)負(fù)號就可以了
scrollBy(-dx, 0);
}
}else{//向右滑動
//邊界控制,如果Content已經(jīng)完全顯示,再滑動的話
//Content右側(cè)就會出現(xiàn)白邊了,進(jìn)行邊界控制
if (getScrollX() - dx <= -mMenuWidth) {
//直接移動到(-mMenuWidth,0)位置,不會出現(xiàn)白邊
scrollTo(-mMenuWidth, 0);
} else {//Content沒有完全顯示呢
//根據(jù)手指移動
scrollBy(-dx, 0);
}
}
mLastX = currentX;
mLastY = currentY;
break;
}
return true;
}

現(xiàn)在我們的SlidingMenu依然是不能夠水平滑動的,但是listview可以豎直滑動,原因是我們的SlidingMenu默認(rèn)是不攔截事件的,那么事件會傳遞給他的子View去執(zhí)行,也就是說傳遞給了Content的ListView去執(zhí)行了,所以listview是可以滑動的,為了簡單,我們先重寫onInterceptTouchEvent方法,我們返回true,讓SlidingMenu攔截事件,我們的SlidingMenu就能夠滑動了,但是ListView是不能滑動的,等下我們會進(jìn)行滑動沖突的處理,現(xiàn)在先實(shí)現(xiàn)SlidingMenu的功能

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return true;
}

好了,現(xiàn)在我們可以自由的滑動我們的SlidingMenu了,并且進(jìn)行了很好的邊界控制,現(xiàn)在我們再添加個(gè)功能,就是當(dāng)Menu打開大于二分之一時(shí),松開手指,Menu自動打開。當(dāng)Menu打開小于二分之一時(shí),松開手指,Menu自動關(guān)閉。自動滑動的功能我們要借助Scroller來實(shí)現(xiàn)

我們在構(gòu)造方法中初始化一個(gè)Scroller

public MySlidingMenu(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
...
mScroller = new Scroller(context);
...
}

然后重寫computeScroll方法,這個(gè)方法是保證Scroller自動滑動的必須方法,這是一個(gè)模板方法,到哪里都這么些就好了

@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()){
scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
invalidate();
}
}

接著我們在onTouchEvent的ACTION_UP中進(jìn)行判斷,判斷當(dāng)前menu打開了多少

case MotionEvent.ACTION_UP:
if (getScrollX() < -mMenuWidth / 2){//打開Menu
//調(diào)用startScroll方法,第一個(gè)參數(shù)是起始X坐標(biāo),第二個(gè)參數(shù)
//是起始Y坐標(biāo),第三個(gè)參數(shù)是X方向偏移量,第四個(gè)參數(shù)是Y方向偏移量
mScroller.startScroll(getScrollX(), 0, -mMenuWidth - getScrollX(), 0, 300);
//設(shè)置一個(gè)已經(jīng)打開的標(biāo)識,當(dāng)實(shí)現(xiàn)點(diǎn)擊開關(guān)自動打開關(guān)閉功能時(shí)會用到
isOpen = true;
//一定不要忘了調(diào)用這個(gè)方法重繪,否則沒有動畫效果
invalidate();
}else{//關(guān)閉Menu
//同上
mScroller.startScroll(getScrollX(), 0, -getScrollX(), 0, 300);
isOpen = false;
invalidate();
}
break;

關(guān)于startScroll中的startX和startY好判斷,那么dx和dy怎么計(jì)算呢?其實(shí)也非常簡單,比如我們startX坐標(biāo)為30,我們想移動到-100,那么startX+dx = -100 –> dx = -100 - startX –> dx = -130

好了現(xiàn)在我們就可以實(shí)現(xiàn)松開手指后自動滑動的動畫效果了
現(xiàn)在我們還需要點(diǎn)擊content中左上角的一個(gè)三角,如果當(dāng)前menu沒有打開,則自動打開,如果已經(jīng)打開,則自動關(guān)閉的功能,自動滑動的效果我們要借助Scroller.startScroll方法

/**
* 點(diǎn)擊開關(guān),開閉Menu,如果當(dāng)前menu已經(jīng)打開,則關(guān)閉,如果當(dāng)前menu已經(jīng)關(guān)閉,則打開
*/
public void toggleMenu(){
if (isOpen){
closeMenu();
}else{
openMenu();
}
}
/**
* 關(guān)閉menu
*/
private void closeMenu() {
//也是使用startScroll方法,dx和dy的計(jì)算方法一樣
mScroller.startScroll(getScrollX(),0,-getScrollX(),0,500);
invalidate();
isOpen = false;
}
/**
* 打開menu
*/
private void openMenu() {
mScroller.startScroll(getScrollX(),0,-mMenuWidth-getScrollX(),0,500);
invalidate();
isOpen = true;
}

然后我們可以在MainActivity中拿到我們content左上角三角形的imageview,然后給他設(shè)置一個(gè)點(diǎn)擊事件,調(diào)用我們的toggleMenu方法

mMenuToggle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mSlidingMenu.toggleMenu();
}
});

處理滑動沖突

由于我們的menu和content是listview,listview是支持豎直滑動的,而我們的slidingMenu是支持水平滑動的,因此會出現(xiàn)滑動的沖突。剛才我們直接在onInterceptTouchEvent中返回了true,因此SlidingMenu就會攔截所有的事件,而ListView接收不到任何的事件,因此ListView不能滑動了,我們要解決這個(gè)滑動沖突很簡單,只需要判斷當(dāng)前是水平滑動還是豎直滑動,如果是水平滑動的話則讓SlidingMenu攔截事件,如果是豎直滑動的話就不攔截事件,把事件交給子View的ListView去執(zhí)行

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
boolean intercept = false;
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
intercept = false;
break;
case MotionEvent.ACTION_MOVE:
int deltaX = (int) ev.getX() - mLastXIntercept;
int deltaY = (int) ev.getY() - mLastYIntercept;
if (Math.abs(deltaX) > Math.abs(deltaY)){//橫向滑動
intercept = true;
}else{//縱向滑動
intercept = false;
}
break;
case MotionEvent.ACTION_UP:
intercept = false;
break;
}
mLastX = x;
mLastY = y;
mLastXIntercept = x;
mLastYIntercept = y;
return intercept;
}

好了,現(xiàn)在我們的滑動沖突就解決了,我們既可以水平滑動SlidingMenu,又可以豎直滑動ListView,那么第一種SlidingMenu就已經(jīng)實(shí)現(xiàn)了,我們再來看看另外兩種怎么去實(shí)現(xiàn)

實(shí)現(xiàn)第二種QQ V6.2.3風(fēng)格的SlidingMenu

這里寫圖片描述 

這種SlidingMenu是和QQ v6.2.3 的側(cè)滑菜單風(fēng)格一致的,我們發(fā)現(xiàn)Menu和Content的滑動速度是有一個(gè)速度差的,實(shí)際上我們可以通過修改Menu的偏移量來達(dá)到這種效果

這里寫圖片描述 

此時(shí)Menu的偏移量為mMenuWidth的2/3,當(dāng)我們慢慢打開Menu的同時(shí),修改Menu的偏移量,最終修改為0

這里寫圖片描述 

這樣就達(dá)到了一種速度差的效果,我們只需要在onTouchEvent的ACTION_MOVE和computeScroll中添加一行如下代碼就可以

mMenu.setTranslationX(2*(mMenuWidth+getScrollX())/3);

我們分析一下,在最開始,mMenuWidth+getScrollX=mMenuWidth,再乘以2/3,得到的就是mMenuWidth的2/3 , 當(dāng)我們滑動至Menu完全打開時(shí),mMenuWidth+getScrollX=0 , 這就達(dá)到了我們的效果

為什么要在computeScroll中也添加這一行代碼呢,因?yàn)楫?dāng)我們滑動過程中,如果我們手指離開屏幕,ACTION_MOVE肯定就不執(zhí)行了,但是當(dāng)我們手指離開屏幕后,會有一段自動打開或者關(guān)閉的動畫,那么這段動畫應(yīng)該繼續(xù)去設(shè)置Menu的偏移量,因此我們在computeScroll中也要添加這一行代碼。

好了,效果我們已經(jīng)實(shí)現(xiàn)了,只需要去設(shè)置Menu的偏移量就可以了,是不是非常簡單

實(shí)現(xiàn)第三種QQ V5.0風(fēng)格的SlidingMenu

這里寫圖片描述 

這個(gè)效果中Menu有一個(gè)偏移的效果,透明度的變化以及放大的效果。Content中有一個(gè)縮小的效果。
首先我們要有一個(gè)變量,用來記錄當(dāng)前menu已經(jīng)打開了多少百分比。

這里寫圖片描述
這里寫圖片描述

這里我們要注意,getScrollX得到的數(shù)值正好是負(fù)值,所以我們計(jì)算的時(shí)候要將getScrollX的值取絕對值再去計(jì)算,我們在onTouchEvent的MOVE中要計(jì)算這個(gè)值,同時(shí)在computeScroll方法中也要計(jì)算這個(gè)值,因?yàn)楫?dāng)我們手指抬起時(shí),可能會執(zhí)行一段自動打開或者關(guān)閉的動畫,那么我們在MOVE中的計(jì)算肯定停止了,但是在執(zhí)行動畫的過程中,是Scroller在起作用,那么computeScroll就會執(zhí)行直到動畫結(jié)束,因此我們要在computeScroll中同樣進(jìn)行計(jì)算

scale = Math.abs((float)getScrollX()) / (float) mMenuWidth;

scale的值是[0,1]的,因此我們就可以根據(jù)這個(gè)值來對menu的偏移量進(jìn)行設(shè)置。
我們可以通過設(shè)置View的setScaleX和setScaleY來對View進(jìn)行放大縮小,當(dāng)然這個(gè)縮放比例要根據(jù)我們的scale值來改變,首先我們的Menu有一個(gè)放大的效果,我們就指定為Menu從0.7放大到1.0,那么我們就可以這樣寫

mMenu.setScaleX(0.7f + 0.3f*scale);
mMenu.setScaleY(0.7f + 0.3f*scale);

透明度是從0到1的,所以我們直接用scale的值就可以了

mMenu.setAlpha(scale);

我還給Menu設(shè)置了一個(gè)偏移量,這個(gè)偏移量大家可以自己計(jì)算,我是這樣計(jì)算的

mMenu.setTranslationX(mMenuWidth + getScrollX() - (mMenuWidth/2)*(1.0f-scale));

設(shè)置完Menu后,我們再來設(shè)置Content,Content的大小是從1.0縮小到0.7,因此我們這樣寫

mContent.setScaleX(1 - 0.3f*scale);
mContent.setPivotX(0);
mContent.setScaleY(1.0f - 0.3f * scale);

其中mContent.setPivotX(0)是讓Content的縮放中心店的X軸坐標(biāo)為0點(diǎn)

我們可以將這個(gè)變化的過程抽取為一個(gè)方法

private void slidingMode3(){
mMenu.setTranslationX(mMenuWidth + getScrollX() - (mMenuWidth/2)*(1.0f-scale));
mMenu.setScaleX(0.7f + 0.3f*scale);
mMenu.setScaleY(0.7f + 0.3f*scale);
mMenu.setAlpha(scale);

mContent.setScaleX(1 - 0.3f*scale);
mContent.setPivotX(0);
mContent.setScaleY(1.0f - 0.3f * scale);
}

將這個(gè)方法添加到onTouchEvent的ACTION_MOVE和computeScroll中就可以了。

我們看到所有的滑動風(fēng)格都是在基于第一種基礎(chǔ)上,修改Menu或者Content的translationX或者scaleX scaleY的值來決定的,因此我們可以打造各種各樣的SlidingMenu來。

以上所述是小編給大家介紹的Android自定義ViewGroup打造各種風(fēng)格的SlidingMenu的相關(guān)知識,希望對大家有所幫助!

相關(guān)文章

  • Android中Activity的四種啟動模式和onNewIntent()

    Android中Activity的四種啟動模式和onNewIntent()

    android 中activity的啟動模式分為四種,(standard、singleTop、singTask、singleInstance),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2018-08-08
  • Android 的觸摸事件詳解及示例代碼

    Android 的觸摸事件詳解及示例代碼

    本文主要介紹Android 的觸摸事件,這里整理了詳細(xì)的資料,并附代碼示例,希望能幫助到有需要的小伙伴
    2016-09-09
  • Android Studio 一個(gè)工程打包多個(gè)不同包名的APK實(shí)例詳解

    Android Studio 一個(gè)工程打包多個(gè)不同包名的APK實(shí)例詳解

    這篇文章主要介紹了Android Studio 一個(gè)工程打包多個(gè)不同包名的APK,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • Android?ViewPager?+?Fragment實(shí)現(xiàn)滑動頁面效果

    Android?ViewPager?+?Fragment實(shí)現(xiàn)滑動頁面效果

    本文通過實(shí)例代碼較詳細(xì)的給大家介紹了Android?ViewPager?+?Fragment實(shí)現(xiàn)滑動頁面效果,需要的朋友可以參考下
    2018-06-06
  • android音頻編輯之音頻裁剪的示例代碼

    android音頻編輯之音頻裁剪的示例代碼

    本篇文章主要介紹了android音頻編輯之音頻裁剪的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-01-01
  • Android插件化-RePlugin項(xiàng)目集成與使用詳解

    Android插件化-RePlugin項(xiàng)目集成與使用詳解

    這篇文章主要介紹了Android插件化-RePlugin項(xiàng)目集成與使用詳解,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-11-11
  • Android入門之Adapter的簡單使用教程

    Android入門之Adapter的簡單使用教程

    Adapter其實(shí)就是MVC的概念。這篇文章主要為大家簡單介紹一下Android中Adapter的簡單使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2022-11-11
  • Kotlin條件控制語句匯總講解

    Kotlin條件控制語句匯總講解

    條件控制是每門編程語言中必不可少的,一般就是使用我們所熟知的 ifelse ,來作為我們代碼邏輯選擇條件控制。 在 Java 中一般使用 ifelse 和 switch-case 來作為條件控制,而在 Kotlin 中則是使用 if-else 和 when 來作為條件控制
    2022-09-09
  • Android Jetpack組件中LiveData的優(yōu)劣

    Android Jetpack組件中LiveData的優(yōu)劣

    LiveData是Jetpack組件的一部分,更多的時(shí)候是搭配ViewModel來使用,相對于Observable,LiveData的最大優(yōu)勢是其具有生命感知的,換句話說,LiveData可以保證只有在組件(?Activity、Fragment、Service)處于活動生命周期狀態(tài)的時(shí)候才會更新數(shù)據(jù)
    2023-04-04
  • 一文詳解?Compose?Navigation?的實(shí)現(xiàn)原理

    一文詳解?Compose?Navigation?的實(shí)現(xiàn)原理

    這篇文章主要介紹了一文詳解?Compose?Navigation的實(shí)現(xiàn)原理,文章通告圍繞主題展開詳細(xì)的相關(guān)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08

最新評論