java layoutmanager_Java LayoutManager.getChildAt方法代码示例

import android.support.v7.widget.RecyclerView.LayoutManager; //导入方法依赖的package包/类

private List findSwapTargets(ViewHolder viewHolder) {

if (this.mSwapTargets == null) {

this.mSwapTargets = new ArrayList();

this.mDistances = new ArrayList();

} else {

this.mSwapTargets.clear();

this.mDistances.clear();

}

int margin = this.mCallback.getBoundingBoxMargin();

int left = Math.round(this.mSelectedStartX + this.mDx) - margin;

int top = Math.round(this.mSelectedStartY + this.mDy) - margin;

int right = (viewHolder.itemView.getWidth() + left) + (margin * 2);

int bottom = (viewHolder.itemView.getHeight() + top) + (margin * 2);

int centerX = (left + right) / 2;

int centerY = (top + bottom) / 2;

LayoutManager lm = this.mRecyclerView.getLayoutManager();

int childCount = lm.getChildCount();

for (int i = 0; i < childCount; i++) {

View other = lm.getChildAt(i);

if (other != viewHolder.itemView && other.getBottom() >= top && other.getTop() <= bottom && other.getRight() >= left && other.getLeft() <= right) {

ViewHolder otherVh = this.mRecyclerView.getChildViewHolder(other);

if (this.mCallback.canDropOver(this.mRecyclerView, this.mSelected, otherVh)) {

int dx = Math.abs(centerX - ((other.getLeft() + other.getRight()) / 2));

int dy = Math.abs(centerY - ((other.getTop() + other.getBottom()) / 2));

int dist = (dx * dx) + (dy * dy);

int pos = 0;

int cnt = this.mSwapTargets.size();

int j = 0;

while (j < cnt && dist > ((Integer) this.mDistances.get(j)).intValue()) {

pos++;

j++;

}

this.mSwapTargets.add(pos, otherVh);

this.mDistances.add(pos, Integer.valueOf(dist));

}

}

}

return this.mSwapTargets;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现弧形滚动和中间缩小的效果需要自定义LayoutManager。具体步骤如下: 1. 继承LinearLayoutManager,重写calculateExtraLayoutSpace方法,将多余空间分配给中间的item。 ```java public class ArcLayoutManager extends LinearLayoutManager { private float mShrinkAmount = 0.15f; private float mShrinkDistance = 0.9f; private int mVerticalOffset; private Context mContext; public ArcLayoutManager(Context context) { super(context); mContext = context; } @Override protected int calculateExtraLayoutSpace(RecyclerView.State state, int extraLayoutSpace, int[] extraLayoutSpaceInOther) { int height = getHeight(); int width = getWidth(); int itemCount = getItemCount(); int extra = (int) (width * (1 - Math.pow(1 - mShrinkAmount, itemCount))) / 2; return Math.max(extra, extraLayoutSpace); } } ``` 2. 重写scrollVerticallyBy方法,实现滚动时弧形效果。 ```java @Override public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) { int scrolled = super.scrollVerticallyBy(dy, recycler, state); mVerticalOffset += scrolled; float midpoint = getHeight() / 2.f; float d0 = 0.f; float d1 = mShrinkDistance * midpoint; float s0 = 1.f; float s1 = 1.f - mShrinkAmount; for (int i = 0; i < getChildCount(); i++) { View child = getChildAt(i); float childMidpoint = (getDecoratedBottom(child) + getDecoratedTop(child)) / 2.f; float d = Math.min(d1, Math.abs(midpoint - childMidpoint)); float scale = s0 + (s1 - s0) * (d - d0) / (d1 - d0); child.setScaleX(scale); child.setScaleY(scale); } return scrolled; } ``` 3. 在LayoutManager中重写generateDefaultLayoutParams方法,设置item的宽高。 ```java @Override public RecyclerView.LayoutParams generateDefaultLayoutParams() { return new RecyclerView.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); } ``` 4. 在RecyclerView中设置LayoutManager为自定义的ArcLayoutManager。 ```java recyclerView.setLayoutManager(new ArcLayoutManager(this)); ``` 5. 最后,在RecyclerView的Adapter中为item设置宽高和布局参数。 ```java @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { ViewGroup.LayoutParams layoutParams = holder.itemView.getLayoutParams(); layoutParams.width = (int) (mContext.getResources().getDisplayMetrics().widthPixels * 0.7f); layoutParams.height = (int) (layoutParams.width * 1.2f); holder.itemView.setLayoutParams(layoutParams); } ``` 这样,就可以实现弧形滚动和中间缩小的效果了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值