android 滚动画画,Android利用ViewPager实现可滑动放大缩小画廊效果

画廊在很多的App设计中都有,如下图所示:

225254HH-0.gif

该例子是我没事的时候写的一个小项目,具体源码地址请访问https://www.easck.com/>

使用方式

布局中添加该自定义控件

xmlns:tools="http://www.easck.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/cover"

android:layout_width="match_parent"

android:layout_height="wrap_content" />

代码中设置

代码中设置分为以下几个步骤:

•查找控件

•初始化数据

•将需要显示的数据设置到控件上

•设置滑动监听

public class MainActivity extends AppCompatActivity {

private CoverFlowViewPager mCover;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mCover = (CoverFlowViewPager) findViewById(R.id.cover);

// 初始化数据

List list = new ArrayList<>();

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

ImageView img = new ImageView(this);

img.setBackgroundColor(Color.parseColor("#"+getRandColorCode()));

list.add(img);

}

//设置显示的数据

mCover.setViewList(list);

// 设置滑动的监听,该监听为当前页面滑动到中央时的索引

mCover.setOnPageSelectListener(new OnPageSelectListener() {

@Override

public void select(int position) {

Toast.makeText(getApplicationContext(),position+"",Toast.LENGTH_SHORT).show();

}

});

}

/**

* 获取随机颜色,便于区分

* @return

*/

public static String getRandColorCode(){

String r,g,b;

Random random = new Random();

r = Integer.toHexString(random.nextInt(256)).toUpperCase();

g = Integer.toHexString(random.nextInt(256)).toUpperCase();

b = Integer.toHexString(random.nextInt(256)).toUpperCase();

r = r.length()==1 ? "0" + r : r ;

g = g.length()==1 ? "0" + g : g ;

b = b.length()==1 ? "0" + b : b ;

return r+g+b;

}

}

实现原理

实现过程中有两个难点:

•如何实现滑动过程中的放大与缩小

•如何显示ViewPager中未被显示的页面

如何实现滑动过程中的放大与缩小?

在设置每一个ViewPager 的页面时,对每一个页面都设置一个固定的padding值,这样每个页面都会显示缩小状态。同时ViewPager设置addOnPageChangeListener(),滑动监听,在该滑动监听中会回调ViewPager的滑动的状态,滑动的偏移量等,根据滑动的偏移量进行放大缩小。及根据padding值设置控件的显示大小

public class Touch extends Activity implements OnTouchListener, OnClickListener { private static final String TAG = "Touch" ; // These matrices will be used to move and zoom image Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); PointF start = new PointF(); PointF mid = new PointF(); float oldDist; private ImageView view; private Button zoomIn, zoomOut; //button zoom private float scaleWidth = 1; private float scaleHeight = 1; private Bitmap bmp, zoomedBMP; private int zoom_level = 0; private static final double ZOOM_IN_SCALE = 1.25;//放大系数 private static final double ZOOM_OUT_SCALE = 0.8;//缩小系数 // We can be in one of these 3 states static final int NONE = 0; static final int DRAG = 1; static final int ZOOM = 2; int mode = NONE; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //放大按钮 zoomIn = (Button) findViewById(R.id.zoom_in); //缩小按钮 zoomOut = (Button) findViewById(R.id.zoom_out); zoomIn.setOnClickListener(this); zoomOut.setOnClickListener(this); view = (ImageView) findViewById(R.id.imageView); view.setOnTouchListener(this); //取得drawable中图片,放大缩小,多点触摸的作用对象 bmp = BitmapFactory.decodeResource(Touch.this.getResources(), R.drawable.butterfly); } public boolean onTouch(View v, MotionEvent event) { // Handle touch events here... ImageView view = (ImageView) v; // Handle touch events here... switch (event.getAction() & MotionEvent.ACTION_MASK) { //设置拖拉模式 case MotionEvent.ACTION_DOWN: savedMatrix.set(matrix); start.set(event.getX(), event.getY()); Log.d(TAG, "mode=DRAG" ); mode = DRAG; break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = NONE; Log.d(TAG, "mode=NONE" ); break; //设置多点触摸模式 case MotionEvent.ACTION_POINTER_DOWN: oldDist = spacing(event); Log.d(TAG, "oldDist=" + oldDist); if (oldDist > 10f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; Log.d(TAG, "mode=ZOOM" ); } break; //若为DRAG模式,则点击移动图片 case MotionEvent.ACTION_MOVE: if (mode == DRAG) { matrix.set(savedMatrix); // 设置位移 matrix.postTranslate(event.getX() - start.x, event.getX() - start.x); } //若为ZOOM模式,则多点触摸缩放 else if (mode == ZOOM) { float newDist = spacing(event); Log.d(TAG, "newDist=" + newDist); if (newDist > 10f) { matrix.set(savedMatrix); float scale = newDist / oldDist; //设置缩放比例和图片中点位置 matrix.postScale(scale, scale, mid.x, mid.y); } } break; } // Perform the transformation view.setImageMatrix(matrix); return true; // indicate event was handled } //计算移动距离 private float spacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x + y * y); } //计算中点位置 private void midPoint(PointF point, MotionEvent event) { float x = event.getX(0) + event.getX(1); float y = event.getY(0) + event.getY(1); point.set(x / 2, y / 2); } //放大缩小按钮点击事件 @Override public void onClick(View v) { if(v == zoomIn){ enlarge(); }else if (v == zoomOut) { small(); } } //按钮点击缩小函数 private void small() { int bmpWidth = bmp.getWidth(); int bmpHeight = bmp.getHeight(); scaleWidth = (float) (scaleWidth * ZOOM_OUT_SCALE); scaleHeight = (float) (scaleHeight * ZOOM_OUT_SCALE); Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); zoomedBMP = Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix, true); view.setImageBitmap(zoomedBMP); } //按钮点击放大函数 private void enlarge() { try { int bmpWidth = bmp.getWidth(); int bmpHeight = bmp.getHeight(); scaleWidth = (float) (scaleWidth * ZOOM_IN_SCALE); scaleHeight = (float) (scaleHeight * ZOOM_IN_SCALE); Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleHeight); zoomedBMP = Bitmap.createBitmap(bmp, 0, 0, bmpWidth, bmpHeight, matrix, true); view.setImageBitmap(zoomedBMP); } catch (Exception e) { //can't zoom because of memory issue, just ignore, no big deal
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值