前言
- 今天在某APP中看到了这个效果,感觉还不错,所以这就自己动手试了一下,不过还好,总算把这效果给弄出来了!
- 俗话说得好,自己丰衣足食嘛!
- 实现效果:手指上下拉动,可对图片进行缩放,松开手指有回弹效果!
实现过程:
- 获取图片宽高
- 记录起始Y坐标
- 计算图片缩放后的宽高参数
- 回弹动画效果
其它的基本上都是,处理bug写得条件分支
<?xml version="1.0" encoding="utf-8"?>
<com.mycompany.myapp.ZoomScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent"
android:fillViewport="true">
<LinearLayout
android:layout_height="match_parent"
android:layout_width="match_parent"
android:elevation="1dp"
android:gravity="center_horizontal"
android:orientation="vertical">
<ImageView
android:layout_height="200dp"
android:layout_width="match_parent"
android:src="@drawable/image_1"
android:scaleType="centerCrop"/>
<TextView
android:layout_height="66dp"
android:layout_width="match_parent"
android:text="第一项"
android:background="#FFFFFFFF"
android:layout_margin="10dp"
android:elevation="2dp"
android:gravity="center"
android:textSize="18sp"/>
<TextView
android:layout_height="66dp"
android:layout_width="match_parent"
android:text="第二项"
android:background="#FFFFFFFF"
android:layout_margin="10dp"
android:elevation="2dp"
android:gravity="center"
android:textSize="18sp"/>
<TextView
android:layout_height="66dp"
android:layout_width="match_parent"
android:text="第三项"
android:background="#FFFFFFFF"
android:layout_margin="10dp"
android:elevation="2dp"
android:gravity="center"
android:textSize="18sp"/>
<TextView
android:layout_height="66dp"
android:layout_width="match_parent"
android:text="第四项"
android:background="#FFFFFFFF"
android:layout_margin="10dp"
android:elevation="2dp"
android:gravity="center"
android:textSize="18sp"/>
<TextView
android:layout_height="66dp"
android:layout_width="match_parent"
android:text="第五项"
android:background="#FFFFFFFF"
android:layout_margin="10dp"
android:elevation="2dp"
android:gravity="center"
android:textSize="18sp"/>
<TextView
android:layout_height="66dp"
android:layout_width="match_parent"
android:text="第六项"
android:background="#FFFFFFFF"
android:layout_margin="10dp"
android:elevation="2dp"
android:gravity="center"
android:textSize="18sp"/>
<TextView
android:layout_height="66dp"
android:layout_width="match_parent"
android:text="第七项"
android:background="#FFFFFFFF"
android:layout_margin="10dp"
android:elevation="2dp"
android:gravity="center"
android:textSize="18sp"/>
<TextView
android:layout_height="66dp"
android:layout_width="match_parent"
android:text="第八项"
android:background="#FFFFFFFF"
android:layout_margin="10dp"
android:elevation="2dp"
android:gravity="center"
android:textSize="18sp"/>
<TextView
android:layout_height="66dp"
android:layout_width="match_parent"
android:text="第九项"
android:background="#FFFFFFFF"
android:layout_margin="10dp"
android:elevation="2dp"
android:gravity="center"
android:textSize="18sp"/>
<TextView
android:layout_height="66dp"
android:layout_width="match_parent"
android:text="第十项"
android:background="#FFFFFFFF"
android:layout_margin="10dp"
android:elevation="2dp"
android:gravity="center"
android:textSize="18sp"/>
</LinearLayout>
</com.mycompany.myapp.ZoomScrollView>
public class ZoomScrollView extends ScrollView
{
private View imageView;
private ViewGroup.LayoutParams lp_move,lp_up;
private int startY,offsetY;
private int height,width;
private boolean isFirst=true;
private int MaxHeight=0,MaxWidth=0,MaxOffsetY=0;
public ZoomScrollView(Context context)
{
super(context);
}
public ZoomScrollView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public ZoomScrollView(Context context, AttributeSet attrs, int defStyleAttr)
{
super(context, attrs, defStyleAttr);
}
@Override
protected void onFinishInflate()
{
super.onFinishInflate();
ViewGroup vg = (ViewGroup) getChildAt(0);
imageView = vg.getChildAt(0);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev)
{
switch (ev.getAction())
{
case MotionEvent.ACTION_DOWN:
{
startY = (int) ev.getY();
MaxHeight = 0;
MaxWidth = 0;
MaxOffsetY = 0;
if (getScrollY() == 0 && isFirst == true)
{
height = imageView.getHeight();
width = imageView.getWidth();
isFirst = false;
}
}
break;
case MotionEvent.ACTION_MOVE:
{
offsetY = ((int) ev.getY()) - startY;
lp_move = imageView.getLayoutParams();
if (offsetY > 0 && getScrollY() == 0)
{
lp_move.height = height + (int)(offsetY * 0.5);
lp_move.width = width + (int)(offsetY * 0.5);
imageView.setLayoutParams(lp_move);
MaxHeight = Math.max(imageView.getHeight(), MaxHeight);
MaxWidth = Math.max(imageView.getWidth(), MaxWidth);
MaxOffsetY = Math.max(offsetY, MaxOffsetY);
}
else if (imageView.getHeight() > height)
{
scrollTo(0, 0);
lp_move.height = Math.max((MaxHeight - (MaxOffsetY - offsetY)), height);
lp_move.width = Math.max((MaxWidth - (MaxOffsetY - offsetY)), width);
imageView.setLayoutParams(lp_move);
}
else
{
startY = (int) ev.getY();
MaxHeight = 0;
MaxWidth = 0;
MaxOffsetY = 0;
}}
break;
case MotionEvent.ACTION_UP:
{
ValueAnimator anim=ValueAnimator.ofFloat(1.0f, 0.0f);
anim.setDuration(400);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener(){
@Override
public void onAnimationUpdate(ValueAnimator p1)
{
float current=p1.getAnimatedValue();
lp_up = imageView.getLayoutParams();
lp_up.height = height + (int)((imageView.getHeight() - height) * current);
lp_up.width = width + (int)((imageView.getWidth() - width) * current);
imageView.setLayoutParams(lp_up);
}
});
anim.start();
}
break;
}
return super.dispatchTouchEvent(ev);
}
}