android實現瀑布流
㈠ 求教 android瀑布流該如何實現
網上關於android瀑布流的例子一大堆,但是很多都是很復雜,對於新手來說有一定的難度。
原理很簡單,就是非同步下載圖片,把圖片addView到ScrollView(因為可以上下一直拖動)中,你需要屏幕顯示幾列就在ScrollView中放置幾個LinearLayout,
下面我就一個簡單的例子來講解android瀑布流的用法,樣子很醜就不上圖了。。
1、在xml布局文件:很簡單就是
2、在java代碼中:
先聲明幾個變數,其中imagePathStr數組用來存圖片的鏈接
private LinearLayout leftLayout;
private LinearLayout rightLayout;
private String[] imagePathStr = { "http://www.cf69.com/Upfiles/BeyondPic/2010-08/20108175740983313.jpg",
"http://www.syfff.com/UploadFile/pic/2008122163204.jpg", "http://pic.newssc.org/0/10/34/32/10343297_564251.jpg",
"http://ent.hangzhou.com.cn/images/20090311/zym2009031323.jpg", "http://a4.att.hudong.com/86/60/01300000013093119087608457965.jpg",
"http://file.sdteacher.gov.cn/upload/gz0901/images/0907/22/110437191.jpg",
"http://www.fun9.cn/uploadfile/starpic/uploadpics/200910/20091008090155126.jpg",
"http://img3.yxlady.com/yl/UploadFiles_5361/20110820/20110820120609469.jpg",
其次,在oncreate()中採用非同步載入圖片的方法把獲取到的Drawable添加到左右兩欄的LinearLayout中:
㈡ 1.Android recycleView萬能分隔線 GridLayoutManager布局item左右間距均等(最易懂)
今天開始講RecycleView的系列教程。分割線,分組,局部刷新,動態添加,緩存原理,抖音效果,瀑布流。嵌套,動畫等等
RecyclerView的分割線是通過canvas和設置item偏移畫出來的.需要知道2個方法
getItemOffsets()和onDraw方法
getItemOffsets 是針對每一個 ItemView
onDraw:遍歷,進行顏色修改
我們可以看到自定義的 TestDividerItemDeoration 只實現了一個方法 getItemOffsets()。方法裡面有四個參數。
Rect outRect
View view
RecyclerView parent
RecyclerView.State state
綠色區域代表 RecyclerView 中的一個 ItemView,而外面橙色區域也就是相應的 outRect,也就是 ItemView 與其它組件的偏移區域,等同於 margin 屬性,通過復寫 getItemOffsets() 方法,然後指定 outRect 中的 top、left、right、bottom 就可以控制各個方向的間隔了。
這實現了簡單的分隔線效果,但這種方法分隔線的效果只能取決於背景色,如果我要定製分割線的顏色呢?這個時候就要 onDraw()。
————————————————
源碼分析:在recycleview中的
分割線要注意,沒有顏色,默認是白色的,會看不出來
第一種方案,通過
getItemOffsets()方法進行分割線!
判斷是否是第一個,最後一個,是單個還是雙個,是什麼類型
/***
* 分割線要注意,沒有顏色,默認是白色的,會看不出來
* @param outRect
* @param view
* @param parent
* @param state
*/
private void testItemOffset(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
int childAdapterPosition = parent.getChildAdapterPosition(view);
if (childAdapterPosition ==0) {
outRect.set(0, 20, 0, 20);
}else {
outRect.set(0, 0, 0, 20);
}
}
第二種方案:ondraw()
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDraw(c, parent, state);
int childCount = parent.getChildCount();
for (int i =0; i < childCount; i++) {
View view = parent.getChildAt(i);
int index = parent.getChildAdapterPosition(view);
//第一個ItemView不需要繪制
if (index ==0) {
continue;
}
float dividerTop = view.getTop() -mDividerHeight;
float dividerLeft = parent.getPaddingLeft();
float dividerBottom = view.getTop();
float dividerRight = parent.getWidth() - parent.getPaddingRight();
c.drawRect(dividerLeft, dividerTop, dividerRight, dividerBottom, mPaint);
}
}
GridLayoutManager布局item左右間距均等
思路分析
首先,我們知道,對於 GridLayoutmanager ,當我們設置的 spancount 為 3 的時候,那麼每個 item 的最大寬度為 itemMaxW = recycylerW / spancount = recycylerW / 3.
假設我們 spancount 為 3,那麼在不設置 itemDercation 的情況下它的分布是這樣的,可以看到第一列與最後一行的距離是不一樣的
GridVIew出現的問題:本來固定item.高度和寬度
1.分割線有,不是理想的,左右均等
2.上下沒有分割線
源碼得到:
按上面分析的源碼,我們可以知道,調用outRect.set(int left, int top, int right, int bottom)方法時,left一直為0,right一直為divider的寬度,而每一項item的寬度都要減去(left+right)大小,
left一直為0,right一直為divider的寬度
左上右下到底是什麼的值?
計算每一個item移動的距離,左邊和右邊的移動距離
計算分析:
1.左邊的分割線寬度為sW (已知)
2.每個顯示item的寬度,布局定義的itemWidth
3. 總共分割線寬度:totalDivider=屏幕寬度-spanCount*itemWidth
4.列之間的分割線寬度為dw =(屏幕寬度-spanCount*item-2*sW )/(spantcount-1)
5.每個item需要留出的空間 ew=totalDivider/spanCount(即paddingLeft+paddingRight)
left: 左邊的間距值(絕對值,差值)
right:右邊的間距值
每個item移動的距離:
第一個Item:L0=sW R0=eW-sW
第二個Item:L1=dW-R0=dW-eW+sW R1=eW-L1=2eW-dW-sW
第三個Item:L2=dW-R1=2(dW-eW)+sW R2=eW-L2=3eW-2dW-sW
得出公式:
Ln=(position%spanCount)*(dw-ew)+sw
Rn=ew-Ln
總結:得到3個值dw,ew, sw的值
sw:左邊的距離
ew:每個的平均的分割線
dw: 列之間的分割線寬度
int firstLastSpace =50;//最左邊的分割線寬度
@SuppressLint("LongLogTag")
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
count++;
outRect.top =20;
mDividerHeight =0;
int itemWidth =dip2px(context, 100);
int screenWidth = getScreenWidth(context);
int dw = (screenWidth -3 * itemWidth -2 *firstLastSpace) /2;//最終計算出這個padding值
//誤區:中間的分割線的總距離,左右可能是不等的
int totalDivder = screenWidth -3 * itemWidth;
Log.d("TestDividerItemDecoration", "totalDivder" + totalDivder);
int eachDivder = totalDivder /3;
int itemPosition = ((RecyclerView.LayoutParams) view.getLayoutParams()).getViewLayoutPosition();
//不要用for循環
outRect.left = (itemPosition %3) * (dw - eachDivder) +firstLastSpace;
outRect.right = eachDivder - outRect.right;
}
錯誤的思路:
//誤區:中間的分割線的總距離,左右可能是不等的
//不要用for循環
int firstLastSpace =50;//最左邊的分割線寬度
@SuppressLint("LongLogTag")
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
super.getItemOffsets(outRect, view, parent, state);
count++;
outRect.top =20;
mDividerHeight =0;
int itemWidth =dip2px(context, 100);
int screenWidth = getScreenWidth(context);
int padding = (screenWidth -3 * itemWidth -2 *firstLastSpace) /4;//最終計算出這個padding值
//不能這么算,必須保證每個item的分割線一樣才行。
Log.d("TestDividerItemDecoration", "getItemOffsets" +count +"item寬度:" + itemWidth +"padding" + padding);
//僅僅計算左邊和右邊的距離
int childCount = parent.getChildCount();
for (int i =0; i < childCount; i++) {
if (i %3 ==0) {//最左邊的item
outRect.left =firstLastSpace;
outRect.right = padding;
}else if (i %3 ==1) {
outRect.left = padding;
outRect.right = padding;
}else if (i %3 ==2) {
outRect.left = padding;
outRect.right =firstLastSpace;
}
}
}
瀑布流的設置:
int spanIndex = layoutParams.getSpanIndex();
public class FeedDecorationextends RecyclerView.ItemDecoration {
private ;
public FeedDecoration(HomePageCardAdapter mHomePageCardAdapter) {
this.mHomePageCardAdapter = mHomePageCardAdapter;
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state) {
if (mHomePageCardAdapter ==null) {
return;
}
if (mHomePageCardAdapter.getItemViewType(parent.getChildAdapterPosition(view)) == HomePageMultipleCard.HOMEPAGE_MULTIPLE_CARD_TYPE_FITNESS_FEED) {
StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) view.getLayoutParams();
int spanIndex = layoutParams.getSpanIndex();
if (spanIndex ==0) {
outRect.set(DensityUtil.dip2px(ShadowApp.context(), 14), 0, DensityUtil.dip2px(ShadowApp.context(), 5), DensityUtil.dip2px(ShadowApp.context(), 10));
}else {
outRect.set(DensityUtil.dip2px(ShadowApp.context(), 5), 0, DensityUtil.dip2px(ShadowApp.context(), 14), DensityUtil.dip2px(ShadowApp.context(), 10));
}
}
}
}
demo地址: https://github.com/pengcaihua123456/shennanda
㈢ android 怎麼實現 逆向瀑布流
android 實現逆向瀑布流
將實例化imageview往layout裡面添加
通過linearlayout
三個流的瀑布代碼:
㈣ Android之RecyclerView介紹
從Android 5.0開始,谷歌公司推出了一個用於大量數據展示的新控制項RecylerView,可以用來代替傳統的ListView,更加強大和靈活。
RecyclerView是一個強大的滑動組件,與經典的ListView相比,同樣擁有item回收復用的功能,這一點從它的名字Recyclerview即回收view也可以看出。
RecyclerView 支持 線性布局、網格布局、瀑布流布局 三種,而且同時還能夠控制橫向還是縱向滾動。
RecyclerView 基礎使用關鍵點同樣有兩點:
另外,系統已經為我們提供了三個相關的實現類 LinearLayoutManager(線性布局效果)、GridLayoutManager(網格布局效果)、StaggeredGridLayoutManager(瀑布流布局效果)。
使用RecyclerView,當前版本需要直接在xml文件中定義:
效果圖:
㈤ android瀑布流怎麼顯示
今天介紹一個瀑布流控制項:PinterestLikeAdapterVie
使用方法類似於ListView,下面是我使用該控制項實現一個顯示系統圖片的簡單應用:
xml中:
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000000"
>
<com.huewu.pla.lib.multicolumnlistview<p="">
xmlns:pla="http://schemas.android.com/apk/res-auto"
android:background="#000000"
android:id="@+id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
pla:plaColumnNumber="3"
pla:plaLandscapeColumnNumber="3"
>
plaColumnNumber表示顯示多少列,plaLandscapeColumnNumber表示橫屏下顯示多少列。
但與StaggeredGridView不同的是他沒有提供設置item之間間隙大小的屬性,這個可以通過在item的xml中設置一個padding來解決。
㈥ 如何給recyclerView瀑布流設置均等間距
adapter裡面計算寬高,這個寬高可以讓伺服器獲取當讓我們也可以自己獲取。
下面就說下實現方式吧
既然要動態適配寬高就要根據圖片的寬度和手機的寬度計算出比率來然後根據這個比率來計算imageview的高度
package com.jtech.scrollimageloaddemo;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.jtech.adapter.RecyclerAdapter;
import com.jtech.view.RecyclerHolder;
import java.util.ArrayList;
import java.util.List;
/**
* 圖片適配器
* 關於 同等間距的recycleView
* 我們在xml文件里設置的距離是dp 在代碼里設置的距離是px
* 所以都在代碼中設置統一格式就是同等編劇的recyclerview
* Created by wuxuyang on 16/5/6.
*/
public class ImageAdapter extends RecyclerAdapter<ImageModel> {
private boolean isScroll = false;
private int itemWidth;
public ImageAdapter(Activity activity) {
super(activity);
//計算item的寬度
itemWidth = (DeviceUtils.getScreenWidth(activity)-48) / 2;
}
public void setScroll(boolean scroll) {
isScroll = scroll;
if (!isScroll) {
notifyDataSetChanged();
}
}
@Override
public View createView(LayoutInflater layoutInflater, ViewGroup viewGroup, int i) {
return layoutInflater.inflate(R.layout.view_item, viewGroup, false);
}
@Override
public void convert(RecyclerHolder recyclerHolder, ImageModel imageModel, int i) {
ImageView imageView = recyclerHolder.getView(R.id.imageview);
//等比縮放
double ratio = (itemWidth * 1.0) / imageModel.getWidth();
int height = (int) (imageModel.getHeight() * ratio);
ViewGroup.LayoutParams layoutParams = imageView.getLayoutParams();
layoutParams.width = itemWidth;
layoutParams.height = height;
imageView.setLayoutParams(layoutParams);
//顯示圖片
// if (isScroll) {
// imageView.setImageResource(R.mipmap.ic_launcher);
// } else {
Glide.with(getActivity()).load(imageModel.getUrl()).placeholder(R.mipmap.ic_launcher).into(imageView);
// }
}
}
㈦ android瀑布流怎麼實現點擊監聽
holder.imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String webInfo = holder2.url2.getText().toString();
StaggeredAdapter裡面的點擊事件這樣寫,外面要用final定義,你直接findviewbyid,肯定只會找到第一個item的裡面的textview的url2,所以不管點哪個都會顯示第一個的,你這樣寫,不光瀑布流會這樣,就算普通的listview也會這樣。你這標題一個「瀑布流」估計很多人都不會來看是哪裡錯了,其實跟瀑布流一點關系沒有
㈧ 像美麗說,蘑菇街瀑布流布局在Android中是怎麼做的
那個是需要一個主題的,你可以在網上網路一下,搜索一下這主題。
㈨ android listview 每行中 有兩列。 第二列有兩行的效果是怎麼做的 下圖給圖~
可以用「瀑布流」實現。
github上有很多:https://github.com/search?utf8=%E2%9C%93&q=android+waterfall&type=Repositories&ref=searchresults
㈩ android recyclerview到底提示
我也不知道你是什麼意思。
RecyclerView是一個增強版的ListView,不僅可以輕松實現和ListView同樣的效果,還優化了ListView存在的各種不足之處。可以使用RecyclerView實現縱向布局、橫向布局、網格布局、瀑布流布局,其中瀑布流最為炫酷。