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