【问题标题】:How to make a rotating menu on Android Studio?如何在 Android Studio 上制作旋转菜单?
【发布时间】:2019-01-23 21:00:46
【问题描述】:

我正在尝试为儿童应用编写旋转菜单。这个想法是让孩子们在不同的场景之间切换,每个场景都包含不同的动物。

动物呈现在圆形表面上,当孩子们向右或向左滑动时,地球会旋转,旧动物淡出,新动物淡入,有点像这样:

我试图达到的结果类似于 iOS iCarousel 轮子效果。

Toxic Bakery 的 ViewPagerTransforms 库 (https://github.com/ToxicBakery/ViewPagerTransforms) 有一个非常相似的名为 Rotate Down 的效果,但我无法根据需要对其进行调整。页面自行滚动,而不是在公共轴上旋转。

我也尝试过 CursorWheelLayout (https://github.com/BCsl/CursorWheelLayout),但由于图像存在许多性能问题,导致应用崩溃。

我最近的尝试是 SpinMenu (https://github.com/Hitomis/SpinMenu),非常棒。片段确实在公共轴上旋转,但仅在缩小时。我还没有想出一种方法让它改变页面(就像 ViewPager 那样),片段旋转进出视图。

有什么建议可以达到预期的效果吗?

【问题讨论】:

    标签: java android android-recyclerview rotation android-viewpager


    【解决方案1】:

    这是我找到的解决方案:

    1) 实现 CarouselView 库:https://gtomato.github.io/carouselview/

    2) 由于 CarouselView 从 RecyclerView 扩展而来,为 CarouselView 创建布局以膨胀(我称之为 carouselview_item):

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
    
        <ImageView
            android:id="@+id/imageview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_launcher_background"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </android.support.constraint.ConstraintLayout>
    

    3) 由于 CarouselView 从 RecyclerView 扩展而来,创建一个 CarouselViewAdapter 从 RecyclerView.Adapter 扩展

    public class CarouselViewAdapter extends RecyclerView.Adapter<CarouselViewAdapter.ViewHolder> {
    
        private List<Fragment> list;
    
        public CarouselViewAdapter(List<Fragment> list) {
            this.list = list;
        }
    
        @NonNull
        @Override
        public CarouselViewAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.carouselview_item, parent, false);
            return new ViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(@NonNull CarouselViewAdapter.ViewHolder holder, int position) {
            Fragment fragment = list.get(position);
            holder.bind(object);
        }
    
        @Override
        public int getItemCount() {
            return list.size();
        }
    
        // In case you are using, let's say, RxJava for getting the list
        public void setObjects(List<Fragment> list) {
            if (list.size() == 0) {
                this. = list;
            } else {
                this.list.addAll(list);
                notifyDataSetChanged();
            }
        }
    
        public class ViewHolder extends RecyclerView.ViewHolder {
            private T example;
    
            public ViewHolder(View itemView) {
                super(itemView);
                // Find your views:
                // example = itemView.findViewById(R.id.example);
            }
    
            public void bind(T object){
                // Bind the info you need to the view:
                // example.setInfo(object.getInfo)
                }
            }
        }
    }
    

    4) 在 Activity 上进行设置,包括所需的 Transformer 和适配器:

    public class MainActivity extends AppCompatActivity {
    
        private CarouselView carouselView;
        private List<Fragment> list;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            initAssets();
    
            Fragment object1 = new T(/* necessary parameters, if any*/);
            Fragment object2 = new T(/* necessary parameters, if any*/);
            Fragment object3 = new T(/* necessary parameters, if any*/);
    
            list.add(object1);
            list.add(object2);
            list.add(object3);
    
            carouselView.setTransformer(new WheelViewTransformer());
            carouselView.setAdapter(new CarouselViewAdapter(list));
        }
    
        private void initAssets() {
            carouselView = findViewById(R.id.carouselview);
            list = new ArrayList<>();
        }
    }
    

    它对我很有效,尽管由于我现在使用的图像,性能不是很好。

    享受吧!

    【讨论】:

      猜你喜欢
      • 2012-11-03
      • 1970-01-01
      • 2013-10-07
      • 2013-10-05
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-17
      • 2012-01-15
      相关资源
      最近更新 更多