IOS相比于Android,动画效果是一方面优势,IOS相机切换时滑动的动画很不错,看着是有一个3D的效果,而且变化感觉很自然。Android也可以通过Graphics下面的Camera可以实现3D效果,开始尝试着用这个做了一下,效果不理想,滑动之后各组文字之间的距离就变了,从立 ...
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; 84 mCustomViewL.scrollRight(); 85 } else if (delta < -distanceLimit && degree < degreeLimit) { 86 Log.d(TAG, "向左滑"); 87 isScroll = true; 88 mCustomViewL.scrollLeft(); 89 } 90 return false; 91 } 92 93 @Override 94 public void onLongPress(MotionEvent e) { 95 // TODO Auto-generated method stub 96 97 } 98 @Override 99 public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,100 float velocityY) {101 // TODO Auto-generated method stub102 return false;103 }104 105 }106 107 @Override108 public boolean onTouch(View v, MotionEvent event) {109 // TODO Auto-generated method stub110 return mGestureDetector.onTouchEvent(event);111 }112 113 114 }
海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com
原标题:Android 实现 IOS相机滑动控件
关键词:Android
*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们:
admin#shaoqun.com
(#换成@)。