diff --git a/.idea/misc.xml b/.idea/misc.xml index cca2cda..7158618 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -37,7 +37,7 @@ - + diff --git a/app/src/main/java/com/example/looprotaryswitch/MainActivity.java b/app/src/main/java/com/example/looprotaryswitch/MainActivity.java index 0541ffd..9f6622f 100644 --- a/app/src/main/java/com/example/looprotaryswitch/MainActivity.java +++ b/app/src/main/java/com/example/looprotaryswitch/MainActivity.java @@ -83,7 +83,7 @@ private void initLoopRotarySwitchView() { .setAutoScrollDirection(LoopRotarySwitchView.AutoScrollDirection.left)//切换方向 .setAutoRotationTime(2000);//自动切换的时间 单位毫秒 mLoopRotarySwitchView3 - .setR(width/3)//设置R的大小 + .setR(width/5)//设置R的大小 .setAutoRotation(true)//是否自动切换 .setAutoScrollDirection(LoopRotarySwitchView.AutoScrollDirection.left)//切换方向 .setAutoRotationTime(2000);//自动切换的时间 单位毫秒 diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 70b7dcf..a891848 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -3,70 +3,104 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" + xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical" + android:weightSum="4" android:fitsSystemWindows="true" tools:context=".MainActivity"> - - - - - - - - - - + - + + android:layout_height="wrap_content" /> + + + + + + + + + + + + + + + + + diff --git a/loopview/src/main/java/com/dalong/library/view/LoopRotarySwitchView.java b/loopview/src/main/java/com/dalong/library/view/LoopRotarySwitchView.java index ca435b4..ec030e8 100755 --- a/loopview/src/main/java/com/dalong/library/view/LoopRotarySwitchView.java +++ b/loopview/src/main/java/com/dalong/library/view/LoopRotarySwitchView.java @@ -3,14 +3,15 @@ import android.animation.Animator; import android.animation.ValueAnimator; import android.content.Context; +import android.content.res.TypedArray; import android.util.AttributeSet; -import android.util.Log; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.animation.DecelerateInterpolator; import android.widget.RelativeLayout; +import com.dalong.library.R; import com.dalong.library.listener.OnItemClickListener; import com.dalong.library.listener.OnItemSelectedListener; import com.dalong.library.listener.OnLoopViewTouchListener; @@ -26,7 +27,13 @@ */ public class LoopRotarySwitchView extends RelativeLayout { - private final static int LoopR = 200; + private final static int LoopR = 200; + + private final static int vertical=0;//竖直 + + private final static int horizontal=1;//水平 + + private int mOrientation=horizontal;//方向 private Context mContext;//上下文 @@ -34,6 +41,12 @@ public class LoopRotarySwitchView extends RelativeLayout { private ValueAnimator rAnimation = null;//半径动画 + private ValueAnimator zAnimation=null; + + private ValueAnimator xAnimation=null; + + private int loopRotationX =0, loopRotationZ =0;//x轴旋转和轴旋转,y轴无效果 + private GestureDetector mGestureDetector = null;//手势类 private int selectItem = 0;//当前选择项 @@ -70,7 +83,7 @@ public class LoopRotarySwitchView extends RelativeLayout { private float limitX=30;//滑动倒最低30 - public static enum AutoScrollDirection{ + public enum AutoScrollDirection{ left,right } /** @@ -79,8 +92,7 @@ public static enum AutoScrollDirection{ * @param context */ public LoopRotarySwitchView(Context context) { - super(context); - init(context); + this(context,null); } /** @@ -90,8 +102,7 @@ public LoopRotarySwitchView(Context context) { * @param attrs */ public LoopRotarySwitchView(Context context, AttributeSet attrs) { - super(context, attrs); - init(context); + this(context, attrs,0); } /** @@ -103,19 +114,22 @@ public LoopRotarySwitchView(Context context, AttributeSet attrs) { */ public LoopRotarySwitchView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); - init(context); - } - - /** - * 初始化 - * - * @param context - */ - private void init(Context context) { this.mContext = context; + TypedArray typedArray=context.obtainStyledAttributes(attrs, R.styleable.LoopRotarySwitchView); + mOrientation=typedArray.getInt(R.styleable.LoopRotarySwitchView_orientation,horizontal); + autoRotation=typedArray.getBoolean(R.styleable.LoopRotarySwitchView_autoRotation,false); + r=typedArray.getDimension(R.styleable.LoopRotarySwitchView_r,LoopR); + typedArray.recycle(); mGestureDetector = new GestureDetector(context, getGeomeryController()); + if(mOrientation==horizontal){//如果是水平 z值为0 如果是竖直z值为90 + loopRotationZ=0; + }else{ + loopRotationZ=90; + } + loopHandler.setLoop(autoRotation); } + /** * handler处理 */ @@ -147,7 +161,7 @@ public void du() { /** * 排序 - *對子View 排序,然后根据变化选中是否重绘,这样是为了实现view 在显示的时候来控制当前要显示的是哪三个view,可以改变排序看下效果 + * 對子View 排序,然后根据变化选中是否重绘,这样是为了实现view 在显示的时候来控制当前要显示的是哪三个view,可以改变排序看下效果 * @param list */ @SuppressWarnings("unchecked") @@ -192,7 +206,8 @@ private GestureDetector.SimpleOnGestureListener getGeomeryController() { return new GestureDetector.SimpleOnGestureListener() { @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { - angle += distanceX / views.size(); + angle+=Math.cos(Math.toRadians(loopRotationZ))*(distanceX/views.size()) + +Math.sin(Math.toRadians(loopRotationZ))*(distanceY/views.size()); initView(); return true; } @@ -200,22 +215,25 @@ public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float d } private void initView() { - int width = getWidth(); for (int i = 0; i < views.size(); i++) { - float x0 = (float)Math.sin(Math.toRadians(angle + 180 - i * 360 / size)) * r; - float y0 = (float)Math.cos(Math.toRadians(angle + 180 - i * 360 / size)) * r; + double radians=angle+180- i * 360 / size; + float x0 = (float)Math.sin(Math.toRadians(radians)) * r; + float y0 = (float)Math.cos(Math.toRadians(radians)) * r; float scale0 = (distance - y0) / (distance + r);//计算子view之间的比例,可以看到distance越大的话 比例越小,也就是大小就相差越小 views.get(i).setScaleX(scale0);//对view进行缩放 views.get(i).setScaleY(scale0);//对view进行缩放 - views.get(i).setX(width /2 + x0 - views.get(i).getWidth() /2); //设置他的坐标 + float rotationX_y=(float)Math.sin(Math.toRadians(loopRotationX *Math.cos(Math.toRadians(radians))))*r; + float rotationZ_y=-(float)Math.sin(Math.toRadians(-loopRotationZ))*x0; + float rotationZ_x=(((float) Math.cos(Math.toRadians(-loopRotationZ))*x0)-x0); + views.get(i).setTranslationX( x0 +rotationZ_x); + views.get(i).setTranslationY(rotationX_y+rotationZ_y); } - List arr = new ArrayList(); - for (int i = 0; i < views.size(); i++) { - arr.add(views.get(i)); - views.get(i).setTag(i); + List arrayViewList =new ArrayList<>(); + arrayViewList.clear(); + for (int i=0;i + + + + + + + + + + \ No newline at end of file