IOS相比于Android,动画效果是一方面优势,IOS相机切换时滑动的动画很不错,看着是有一个3D的效果,而且变化感觉很自然。Android也可以通过Graphics下面的Camera可以实现3D效果,开始尝试着用这个做了一下,效果不理想,滑动之后各组文字之间的距离就变了,从立体空间来说这是合逻辑的,但是看着很别捏。IOS相机的滑动效果文字之间的间隔在滑动的时候是不变的。
后面通过调整TextView X方向的scale使文字看着紧凑一点,然后通过计算的距离的方式,在滑动的时候保持各组文字之间的间隔一致,最后实现的效果还是和IOS的有一定的差距。先上个效果图的。
下面逐步来说下怎么实现:
MainaActivity.java:
往自定义的控件加了6个TextView,对应各个模式。
这里面还实现了一个手势监听,来识别滑动事件。对动画做了一些限制,角度小于30度,滑动距离大于15才能生效。
1 package com.example.androidcustomnview;
2
3 import android.app.Activity;
4 import android.graphics.Color;
5 import android.os.Bundle;
6 import android.util.Log;
7 import android.view.GestureDetector;
8 import android.view.GestureDetector.OnGestureListener;
9 import android.view.View;
10 import android.view.View.OnTouchListener;
11 import android.view.MotionEvent;
12 import android.view.TextureView;
13 import android.view.ViewGroup;
14 import android.view.animation.Animation;
15 import android.view.animation.Animation.AnimationListener;
16 import android.view.animation.AnimationSet;
17 import android.view.animation.TranslateAnimation;
18 import android.widget.FrameLayout;
19 import android.widget.LinearLayout;
20 import android.widget.RelativeLayout;
21 import android.widget.TextView;
22
23 public class MainActivity extends Activity implements OnTouchListener{
24
25 private static final String TAG = "MainActivity.TAG";
26 CustomViewL mCustomViewL;
27 String[] name = new String[] {"延时摄影","慢动作","视频","拍照","正方形","全景"};
28
29 GestureDetector mGestureDetector;
30 RelativeLayout rootView;
31 @Override
32 protected void onCreate(Bundle savedInstanceState) {
33 super.onCreate(savedInstanceState);
34 setContentView(R.layout.activity_main);
35 mCustomViewL = (CustomViewL) findViewById(R.id.mCustomView);
36 rootView = (RelativeLayout) findViewById(R.id.ViewRoot);
37 rootView.setOnTouchListener(this);
38 mCustomViewL.getParent();
39 mCustomViewL.addIndicator(name);
40 mGestureDetector = new GestureDetector(this, new myGestureDetectorLis()); 48 }
49
50 class myGestureDetectorLis implements GestureDetector.OnGestureListener {
51
52 private static final int degreeLimit = 30;
53 private static final int distanceLimit = 15;
54
55 private boolean isScroll = false;
56 @Override
57 public boolean onDown(MotionEvent e) {
58 // TODO Auto-generated method stub
59 Log.d(TAG, "myGestureDetectorLis onDown");
60 isScroll = false;
61 return true;
62 }
63 @Override
64 public void onShowPress(MotionEvent e) {
65 // TODO Auto-generated method stub
66
67 }
68 @Override
69 public boolean onSingleTapUp(MotionEvent e) {
70 // TODO Auto-generated method stub
71 return false;
72 }
73
74 @Override
75 public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
76 float distanceY) {
77 // TODO Auto-generated method stub
78 if (isScroll) return false;
79 double degree = Math.atan(Math.abs(e2.getY() - e1.getY()) / Math.abs(e2.getX() - e1.getX())) * 180 /Math.PI;
80 float delta = e2.getX() - e1.getX();
81 if (delta > distanceLimit && degree < degreeLimit) {
82 Log.d(TAG, "向右滑");
83 isScroll = true;