Android 百叶窗图片切换效果实现
2017-05-02 16:02
447 查看
百叶窗实现原理
百叶窗动画,在图片过渡显示的场景中,表现为两张图片以类似百叶窗的形式,图片交织显示,慢慢由一张图片显示切换到另一张图片。 效果如下图:
百叶窗在Android的实现
在Android的实现,多种多样,我了解的就有二种形式,一种是继承View或者surfaceView,在一个控件内,通过不断绘制实现。另外一种是通个二个ImageView,其中一个绘制原图,另外一个绘制切割的矩形块覆盖在原图上,形成类似的效果,我下面的代码就是这种实现。
1. 布局
<?xml version="1.0" encoding="utf-8"?> <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.xzj.baiyechuan.MainActivity"> <!-- 控制开始百叶窗动画的按钮 --> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentTop="true" android:layout_centerHorizontal="true" android:text="@string/app_name" /> <!-- 父布局 --> <RelativeLayout android:id="@+id/box" android:layout_width="300px" android:layout_height="400px" android:layout_centerHorizontal="true" android:layout_centerVertical="true" > <!-- 绘制原图 --> <ImageView android:id="@+id/imageView1" android:layout_width="300px" android:layout_height="400px" android:contentDescription="@string/app_name" android:scaleType="fitXY" android:src="@drawable/aaa" /> </RelativeLayout> </android.support.constraint.ConstraintLayout>
绘制矩形块的控件
主要是用过PorterDuffXfermode来实现显示矩形块。其具体的原理可以参考
http://blog.csdn.net/iispring/article/details/50472485
public class TestImageView extends ImageView { float curPosition = 0; public TestImageView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); setDraw(canvas); } public void setCurPosition(){ curPosition = 0.5f; setLayerType(View.LAYER_TYPE_SOFTWARE, null); invalidate();; } public void setDraw(Canvas canvas){ if (curPosition >= 1.0f) { return; } int h = canvas.getHeight() / 10; int dh; if (curPosition < 1.0f) { dh = (int)(h * (1 - curPosition * 1)); } else { dh = (int)(h * (1 - curPosition) * 1); } for (int i=0; i<10; i++) { canvas.drawRect(0, i*h, canvas.getWidth(), i*h+dh, CLEARING_PAINT); } } private static final Paint CLEARING_PAINT; static { CLEARING_PAINT = new Paint(); CLEARING_PAINT.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); } }
最后是通过属性动画实现过渡动画切换,并add到父控件中 实现其整个百叶窗效果
TestImageView imgView = new TestImageView (mainActivity); imgView.setImageResource(imgRes); imgView.setScaleType(ScaleType.FIT_XY); LayoutParams lp = new LayoutParams(300, 400); ((RelativeLayout)mainActivity.findViewById(R.id.box)).addView(imgView, lp); imgView.setSwitchingStyle(ss); ObjectAnimator animator = ObjectAnimator.ofFloat(imgView, "curPosition", //0.001f, 0.4f, 0.5f, 1.0f); //0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f); 1.0f); animator.setDuration(5000); animator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { clearViewsNotOnTop((RelativeLayout)mainActivity.findViewById(R.id.box)); } @Override public void onAnimationCancel(Animator animation) { isPlaying = false; } }); animator.start();
private void clearViewsNotOnTop(RelativeLayout parent) { int count = parent.getChildCount(); if (count >= 2) { parent.removeViews(0, count - 1); } }
相关文章推荐
- Android - ImageButton单击切换按钮图片效果的实现
- Android - ImageButton单击切换按钮图片效果的实现
- Android开发之使用ViewPager实现图片左右滑动切换效果
- Android - ImageButton单击切换按钮图片效果的实现
- Android 笔记:ImageButton单击切换按钮图片效果的实现(转)
- Android编程实现图片背景渐变切换与图层叠加效果
- Android UI控件之ImageSwitcher实现图片切换效果
- Android - ImageButton单击切换按钮图片效果的实现
- Android中使用ImageViewSwitcher实现图片切换轮播导航效果
- Android编程单击图片实现切换效果的方法
- Android - ImageButton单击切换按钮图片效果的实现 .
- iOS开发之实现图片自动切换(类似android画廊效果)
- Android - ImageButton单击切换按钮图片效果的实现
- Android - ImageButton单击切换按钮图片效果的实现
- Android自定义ImageView实现点击两张图片切换效果
- Android中使用ImageViewSwitcher实现图片切换轮播导航效果
- Android自定义ViewPager实现个性化的图片切换效果
- Android 图片实现按钮点击切换效果
- iOS开发之实现图片自动切换(类似android画廊效果)
- Android 图片实现按钮点击切换效果