如何在Android中的视图设置不透明度

如何在Android中的视图设置不透明度,第1张

Activity中设置View透明度

View v = new View(this)//要设置的视图

v.setAlpha(0-255)//0-255(RGB数值,0是完全透明,255为不透明)

xml中设置透明度

android:background="#00ffffff"//前面2位是透明度十六进制数值,00完全透明,ff完全不透明,后面六位是颜色十六进制数值

ItemAnimator有2个实现类,分别为SimpleItemAnimator和DefaultItemAnimator, 记录了holder.itemView的边界,决定着item是否可以移动,改变,移除的动画,提供了基础的添加,移除,移动动画。以animateChange为例,看下如何实现的,之前的RecyclerView分析已经讲了什么场景会执行到这里。

preInfo 就是layout之前的holder的info ,postInfo 就是holder真正layout之后的info。animateChange最终实现在DefaultItemAnimator中。

1、动画执行之前,设置初始值,记录,mPendingChanges.add()。

oldViewHolder设置:它本身的TranslationX/Y和Alpha。

newViewHolder设置:newHolder设置为 toX - fromX - prevTranslatonX 和alpha为0,如果oldholder和newHolder的位置重合,则这个值为0。

假如希望有个move的效果,ToX的值是不可能变的,我们可以改变fromX的值,比如在调用notifyItemChange之前,设置fromX的值为holder.item的宽度,也就是设置holder.itemView的left值。

2、依次执行动画,设置结束值,runPendingAnimations()。

因为item改变,分为olderView离开和newView出现,所以对应2个动画。

oldViewHolder设置 : oldViewAnim.translationX(changeInfo.toX - changeInfo.fromX)如果new和old的位置不变,则changeInfo.toX - changeInfo.fromX的值为0,不会有位移效果。只有alpha会从1变成0。

newViewHolder设置: 从初始位置到translationX(0)。alpha从0到1。

同样,如果需要位移效果,改FromX的值,调用notifyitemChange的时候,把holder的left改了,就有move效果了。

3、测试下改了FromX的效果。

主要用于特殊View的绘制和偏移的view,还可以绘制分割线,高亮,可视化边界。

1、绘制特殊的View。如下2个方法。

onDraw(Canvas, RecyclerView, RecyclerView.State) 在item绘制之前。

onDrawOver(Canvas, RecyclerView, RecyclerView.State) 在item绘制之后。

以绘制vertical为例,left和right是确定的。绘制每一个child的botttom或者top即可。

parent.getDecoratedBoundsWithMargins(child, mBounds)mBounds包含了child的位置和大小(包含margin和decorated insert),所以mBouns.bottom - mDivider.getIntrinsicHeight() 就是top。也就是绘制分割线的top值。

2、偏移view。

getItemOffsets(Rect , int ,RecyclerView) measure的时候,会把Decoration的大小计算在view所需的大小中。

可以通过getChildAdapterPosition(View)拿到adapter position 然后给指定的position设置分割线等。

ItemTouchHelper 也是继承自ItemDecoration,并且重写了onDraw()方法,加入了拖拽Dx,Dy偏移量,方便在拖拽过程中,我们可以改变recyclerView中item的展示效果,依据dy执行缩放等。类似卡片,先在onlayoutchildren中布局完成,在childDraw中执行拖拽动画。

1、如果调用了notifyDatasetChanged但是layout还没完成,此时getAdapterPostion为-1 。

2、当item被删除了,或者viewholder已经被回收,getAdapterPostion返回-1。

3、layoutmanager中,应该使用getLayoutPostion参与计算,比如用户需要第五个位置的item。在adapter中,应该使用getAdapterPosition,比如点击。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11358607.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-15
下一篇 2023-05-15

发表评论

登录后才能评论

评论列表(0条)

保存