Android 簡單的實現畫廊效果

2021-09-24 16:31:47 字數 3448 閱讀 8267

對於這乙個效果,主要要的部分和普通的recyclerview沒有太大的差別主要是獲取當前需要放大的那乙個item。然後要對所有當前頁面上可見的item進行高度的改變(這裡為了偷懶只改變了高度,如果要同時改變寬度的話其實方法不會差太多,就是在計算的縮放比例的時候改一改就好了)。

之前在做的時候一開始參考了  >>>這一篇部落格<<

首先是card類(recyclerview)

這乙個類沒有什麼好多說的就是繼承recyclerview就好了。

接下來是cardadapt

對於cardadapt的話,我們需要新增乙個方法  oncreateviewholder  用於初始化卡片item的寬度(高度)。

其中 finalvalue.leftcard 是我們要顯示的那個item的兩邊的item的顯示出來的寬度(我這裡沒有設定邊距所以不用管)。

public void oncreateviewholder(viewgroup parent, view itemview)
在這裡用到了乙個display的類時用於不同單位之間的轉換的類,下面給出**。

public class display 

public static int px2dip(context context, float pxvalue)

}

同時我們還有新增幾個方法:

1.設定每乙個item的寬

private void oncreateviewholder(viewgroup parent, view itemview)
2.為了可以使首尾兩個item也可以在螢幕中間顯示

private void makecenter(view itemview, final int position, int itemcount) 

private void setmargin(view view, int left, int top, int right, int bottom)

}

其餘的**就不多說了

private arraylis***atas = new arraylist<>();

public cardadapt (arraylistdata)

@nonnull

@override

public vh oncreateviewholder(@nonnull viewgroup viewgroup, int i)

@override

public void onbindviewholder(@nonnull vh vh, int i)

@override

public int getitemcount()

class vh extends recyclerview.viewholder

}

然後就是最重要的scalehelper類

首先是要用到的變數

private cards mcard;

private context mcontext;

private int mcardwidth; // 卡片寬度

private int mallwidth;//整個recyclerview的寬度

private int mcurrentpos;//要滾動到的頁面

private linearlayoutmanager mlayoutmanager;

private int mallleft;//主卡片的全部右邊寬度

private int last = 0;

private linearsnaphelper mlinearsnaphelper = new linearsnaphelper();

我們需要在card.addonscrolllistener中的 onscrolled 方法中新增獲取當前的中心item的邏輯。這裡我們要用到的方式是mlayoutmanager.findfirstcompletelyvisibleitemposition()     這乙個方式是獲取當前完全可見的第乙個item的position,但是當當前頁面沒有可以完全顯示的item的時候就會需要特判。

出現這種情況有兩種情況。

1.當當前頁面時首尾頁面的時候,即便會出現當前頁面可見但是now為-1的情況,處理**如下:

if(now == -1 && mcurrentpos == 0)//當當前頁面時首尾頁面的時候,即便會出現當前頁面可見但是now為-1的情況所以下面做特判

}if(now == -1 && mcurrentpos == mlayoutmanager.getitemcount()-1)

}

2.真的只是沒有頁面完全可見,處理**如下:

if(now!=-1)

else if(last * dx <0)

last = dx;

然後在處理完之後呼叫對應的接下來會講到的調整寬度的方法就可以了。

對於處理寬度的方法的話,其實就是根據獲取到的當前的頁面的position來獲取主item和兩邊的item(如果有的話),再通過自己寫的乙個獲取對應百分比的方法   getlper() (接下來會講)來改變頁面的高度,**如下:

public void onscrolledchangedcallback() 

currentview = mcard.getlayoutmanager().findviewbyposition(mcurrentpos);

if (mcurrentpos < mcard.getadapter().getitemcount() - 1)

//調整大小

if (leftview != null)

if (currentview != null)

if (rightview != null)

}

接下來就是之前提到的獲取當前頁面應當顯示的高度比例的方法,**如下:

private float getlper(int left)

else if(left > mallleft )

else

}

還有不要忘記要新增乙個方法,並呼叫:

private void initwidth() 

});}

同時要實現乙個方法用於關聯對應的card:

public void attachtorecyclerview(final cards mcard , linearlayoutmanager ml)
趁年輕,別給自己後悔的機會,錯過了就什麼都來不及了。

簡單說 JavaScript實現雪花飄落效果

settimeout函式用來指定某個函式或某段 在多少毫秒之後執行。它返回乙個整數,表示定時器的編號,以後可以用來取消這個定時器。var timerid settimeout func code,delay setinterval函式的用法與settimeout完全一致,區別僅僅在於setinter...

vue 原型設計 拖拽 Vue實現簡單的拖拽效果

自定義指令v drag l 存在時 只能橫向拖拽 t 存在時 只能縱向拖拽 lt都存在時 可以任意方向拖拽拖拽 margin 0 padding 0 box modifiers el.addeventlistener mousedown handledowncb let disx,disy func...

簡單實現Android鬧鐘功能

鬧鐘的簡單實現,只有顯示時間和設定鬧鐘。alarmview12 3456 78910 1112 1314 1516 1718 1920 2122 2324 2526 2728 2930 3132 3334 3536 3738 3940 4142 4344 4546 4748 4950 5152 53...