iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >怎么实现Android TV 3D卡片无限循环效果
  • 766
分享到

怎么实现Android TV 3D卡片无限循环效果

2023-06-25 12:06:43 766人浏览 独家记忆
摘要

这篇文章主要讲解了“怎么实现Android TV 3D卡片无限循环效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现Android TV 3D卡片无限循环效果”吧!##思路自定义Vi

这篇文章主要讲解了“怎么实现Android TV 3D卡片无限循环效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现Android TV 3D卡片无限循环效果”吧!

##思路

自定义View + 属性动画ObjectAnimator
按键事件特殊处理。

##实现方式

ObjectAnimator属性动画的知识准备。
2、父不居中自定义ScheduleView,View2, View3

<com.base.module.gvclauncher2.ui.ScheduleView        android:id="@+id/schedule_view"        android:layout_width="@dimen/main_card_width"        android:layout_height="@dimen/main_card_height"        android:layout_gravity="center_horizontal"        android:layout_marginTop="@dimen/main_card_margin_top"        android:focusable="true"        android:nextFocusLeft="@+id/contacts_view"        android:nextFocusRight="@+id/call_view">    </com.base.module.gvclauncher2.ui.ScheduleView>

其中android:layout_gravity=“center_horizontal”,使卡片在界面的正中间,其余两张的卡片也是如此,达到3个View的起始位置一直,这样方便之后的动画旋转。

添加自定义ScheduleView

public class ScheduleView extends BasePhoneView {    private static final String TAG = "CallFragment";    private static final boolean DEBUG = true;    private Context mContext;    private View mRootView;    private FrameLayout mMainView;    private ScheduleContract.View mView;    private ScheduleContract.Presenter mPresenter;    public ScheduleView(Context context) {        super(context);        this.mContext = context;        initView();    }    public ScheduleView(Context context, AttributeSet attrs) {        super(context, attrs);        this.mContext = context;        initView();    }    public ScheduleView(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        this.mContext = context;        initView();    }    private void initView() {        findView();        initData();    }    private void findView() {        mRootView = LayoutInflater.from(mContext).inflate(R.layout.fragment_schedule, this);        mMainView = (FrameLayout) mRootView.findViewById(R.id.schedule_contains);        mMainView.setVisibility(View.VISIBLE);    }    private void initData() {        mMainView.removeAllViews();        mView = ScheduleContractFactory.createScheduleView(mContext);        mMainView.addView((View) mView);        mPresenter = ScheduleContractFactory.createSchedulePresenter(mContext, mView);        mPresenter.onCreate();        //这里只是使用mvp的形式添加view.    }    @Override    public void clearAllFocus() {    //清除所有的焦点        if (mView != null) {            mView.clearAllFocus();        }    }    @Override    public void requestFirstFocus() {    //第一个控件强行指定焦点        if (mView != null) {            mView.requestFirstFocus();        }    }    @Override    public void updateListData() {    //更新列表显示        if (mPresenter != null) {            mPresenter.reloadConferenceList();        }    }}

其中fragment_schedule.xml中只有一个简单的FrameLayout. View2 和View3类似。

动画Util

(1) 设置3个卡片的初始位置

public final static float RUN_Y = 22.0f;public final static float RUN_LARGE_Y = 24.0f;public final static float RUN_Y_NEGATIVE = -22.0f;public final static float RUN_LARGE_Y_NEGATIVE = -24.0f;public final static float RUN_X = 1235.0f;public final static float RUN_X_NEGATIVE = -1235.0f;public final static float RUN_LARGE_X = 1366.0f;public final static float RUN_LARGE_X_NEGATIVE = -1366.0f;public void initLeftAnimator(View leftView) {        leftView.setTranslationX(RUN_X_NEGATIVE);//离屏幕中心偏移距离        leftView.setRotationY(RUN_Y);//旋转角度        leftView.setAlpha(LEFT_RIGHT_ALPHA);//设置透明度    }    public void initRightAnimator(View rightView) {        rightView.setTranslationX(RUN_X);//离屏幕中心偏移距离        rightView.setRotationY(RUN_Y_NEGATIVE);//旋转角度        rightView.setAlpha(LEFT_RIGHT_ALPHA);//设置透明度    }    public void initMidAnimator(View midView) {        //由于初始位置在xml中设定是在正中间,这里就不重新设置偏移量        midView.setAlpha(MIDDLE_ALPHA);    }public void midToLeftAnimator(final View runView, boolean anim) {        ObjectAnimator animatorX = ObjectAnimator.ofFloat(runView, "translationX", 0, RUN_X_NEGATIVE); //中间的起始位置未0        ObjectAnimator animatorZ = ObjectAnimator.ofFloat(runView, "rotationY", 0, RUN_Y);        ObjectAnimator animator3 = ObjectAnimator.ofFloat(runView, "alpha", MIDDLE_ALPHA, LEFT_RIGHT_ALPHA);        mMidToLeftAnimator = new AnimatorSet();        mMidToLeftAnimator.play(animatorX).with(animatorZ).with(animator3);        //anim设置是否需要动画执行时间        if (anim) {            mMidToLeftAnimator.setDuration(DURATION);        } else {            mMidToLeftAnimator.setDuration(0);        }        mMidToLeftAnimator.addListener(new Animator.AnimatorListener() {            @Override            public void onAnimationStart(Animator animation) {                mIsScrolling = true;            }            @Override            public void onAnimationEnd(Animator animation) {                //mIsScrolling来判断动画是否完成,来控制下一次动画是否需要执行                mIsScrolling = false;            }            @Override            public void onAnimationCancel(Animator animation) {            }            @Override            public void onAnimationRepeat(Animator animation) {            }        });        mMidToLeftAnimator.start();    }    public void midToRightAnimator(final View runView, boolean anim) {        ObjectAnimator animatorX = ObjectAnimator.ofFloat(runView, "translationX", 0, RUN_X);        ObjectAnimator animatorZ = ObjectAnimator.ofFloat(runView, "rotationY", 0, RUN_Y_NEGATIVE);        ObjectAnimator animator3 = ObjectAnimator.ofFloat(runView, "alpha", MIDDLE_ALPHA, LEFT_RIGHT_ALPHA);        mMidToRightAnimator = new AnimatorSet();        mMidToRightAnimator.play(animatorX).with(animatorZ).with(animator3);        if (anim) {            mMidToRightAnimator.setDuration(DURATION);        } else {            mMidToRightAnimator.setDuration(0);        }        mMidToRightAnimator.addListener(new Animator.AnimatorListener() {            @Override            public void onAnimationStart(Animator animation) {                mIsScrolling = true;            }            @Override            public void onAnimationEnd(Animator animation) {                mIsScrolling = false;            }            @Override            public void onAnimationCancel(Animator animation) {            }            @Override            public void onAnimationRepeat(Animator animation) {            }        });        mMidToRightAnimator.start();    }    public void rightToMidAnimator(final View runView, boolean anim) {        ObjectAnimator animatorX = ObjectAnimator.ofFloat(runView, "translationX", RUN_X, 0);        ObjectAnimator animatorZ = ObjectAnimator.ofFloat(runView, "rotationY", RUN_Y_NEGATIVE, 0);        ObjectAnimator animator3 = ObjectAnimator.ofFloat(runView, "alpha", LEFT_RIGHT_ALPHA, MIDDLE_ALPHA);        mRightToMidAnimator = new AnimatorSet();        mRightToMidAnimator.play(animatorX).with(animatorZ).with(animator3);        if (anim) {            mRightToMidAnimator.setDuration(DURATION);        } else {            mRightToMidAnimator.setDuration(0);        }        mRightToMidAnimator.addListener(new Animator.AnimatorListener() {            @Override            public void onAnimationStart(Animator animation) {                mIsScrolling = true;            }            @Override            public void onAnimationEnd(Animator animation) {                mIsScrolling = false;            }            @Override            public void onAnimationCancel(Animator animation) {            }            @Override            public void onAnimationRepeat(Animator animation) {            }        });        mRightToMidAnimator.start();    }    public void leftToMidAnimator(final View runView, boolean anim) {        ObjectAnimator animatorX = ObjectAnimator.ofFloat(runView, "translationX", RUN_X_NEGATIVE, 0);        ObjectAnimator animatorZ = ObjectAnimator.ofFloat(runView, "rotationY", RUN_Y, 0);        ObjectAnimator animator3 = ObjectAnimator.ofFloat(runView, "alpha", LEFT_RIGHT_ALPHA, MIDDLE_ALPHA);        mLeftToMidAnimator = new AnimatorSet();        mLeftToMidAnimator.play(animatorX).with(animatorZ).with(animator3);        if (anim) {            mLeftToMidAnimator.setDuration(DURATION);        } else {            mLeftToMidAnimator.setDuration(0);        }        mLeftToMidAnimator.addListener(new Animator.AnimatorListener() {            @Override            public void onAnimationStart(Animator animation) {                mIsScrolling = true;            }            @Override            public void onAnimationEnd(Animator animation) {                mIsScrolling = false;            }            @Override            public void onAnimationCancel(Animator animation) {            }            @Override            public void onAnimationRepeat(Animator animation) {            }        });        mLeftToMidAnimator.start();    }    public void rightToLeftAnimator(View runView, boolean anim) {        ObjectAnimator animator1 = ObjectAnimator.ofFloat(runView, "translationX", RUN_X, RUN_LARGE_X);        ObjectAnimator animator2 = ObjectAnimator.ofFloat(runView, "rotationY", RUN_Y_NEGATIVE, RUN_LARGE_Y_NEGATIVE);        ObjectAnimator animator3 = ObjectAnimator.ofFloat(runView, "alpha", LEFT_RIGHT_ALPHA, 0.0f);        //继续往右偏移        ObjectAnimator animator4 = ObjectAnimator.ofFloat(runView, "translationX", RUN_LARGE_X, RUN_X_NEGATIVE);        ObjectAnimator animator5 = ObjectAnimator.ofFloat(runView, "rotationY", RUN_LARGE_Y_NEGATIVE, RUN_LARGE_Y);        //中途隐藏不显示        ObjectAnimator animator6 = ObjectAnimator.ofFloat(runView, "alpha", 0.0f, 0.0f);        ObjectAnimator animator7 = ObjectAnimator.ofFloat(runView, "translationX", RUN_X_NEGATIVE, RUN_X_NEGATIVE);        //往左偏移显示在左边位置        ObjectAnimator animator8 = ObjectAnimator.ofFloat(runView, "rotationY", RUN_LARGE_Y, RUN_Y);        ObjectAnimator animator9 = ObjectAnimator.ofFloat(runView, "alpha", LEFT_RIGHT_ALPHA, LEFT_RIGHT_ALPHA);        //给分段动画设置时间        if (anim) {            animator1.setDuration(170);            animator4.setDuration(60);            animator7.setDuration(170);        } else {            animator1.setDuration(0);            animator4.setDuration(0);            animator7.setDuration(0);        }//with:同时执行,after(动画1):在动画1之后执行,befor(动画1):在动画1之前执行。//请注意以下的after(animator1)。表示动画4.5.6在动画1,2,3执行完毕之后同时执行        mRightToLeftAnimator = new AnimatorSet();        mRightToLeftAnimator.play(animator1).with(animator2).with(animator3);        mRightToLeftAnimator.play(animator4).with(animator5).with(animator6).after(animator1);        mRightToLeftAnimator.play(animator7).with(animator8).with(animator9).after(animator4);        mRightToLeftAnimator.addListener(new Animator.AnimatorListener() {            @Override            public void onAnimationStart(Animator animation) {                mIsScrolling = true;            }            @Override            public void onAnimationEnd(Animator animation) {                //mIsScrolling = false;            }            @Override            public void onAnimationCancel(Animator animation) {            }            @Override            public void onAnimationRepeat(Animator animation) {            }        });        mRightToLeftAnimator.start();    }    public void leftToRightAnimator(View runView, boolean anim) {        ObjectAnimator animator1 = ObjectAnimator.ofFloat(runView, "translationX", RUN_X_NEGATIVE, RUN_LARGE_X_NEGATIVE);        ObjectAnimator animator2 = ObjectAnimator.ofFloat(runView, "rotationY", RUN_Y, RUN_LARGE_Y);        ObjectAnimator animator3 = ObjectAnimator.ofFloat(runView, "alpha", LEFT_RIGHT_ALPHA, 0.0f);        ObjectAnimator animator4 = ObjectAnimator.ofFloat(runView, "translationX", RUN_LARGE_X_NEGATIVE, RUN_X);        ObjectAnimator animator5 = ObjectAnimator.ofFloat(runView, "rotationY", RUN_LARGE_Y, RUN_LARGE_Y_NEGATIVE);        ObjectAnimator animator6 = ObjectAnimator.ofFloat(runView, "alpha", 0.0f, 0.0f);        ObjectAnimator animator7 = ObjectAnimator.ofFloat(runView, "translationX", RUN_X, RUN_X);        ObjectAnimator animator8 = ObjectAnimator.ofFloat(runView, "rotationY", RUN_LARGE_Y_NEGATIVE, RUN_Y_NEGATIVE);        ObjectAnimator animator9 = ObjectAnimator.ofFloat(runView, "alpha", LEFT_RIGHT_ALPHA, LEFT_RIGHT_ALPHA);        if (anim) {            animator1.setDuration(170);            animator4.setDuration(60);            animator7.setDuration(170);        } else {            animator1.setDuration(0);            animator4.setDuration(0);            animator7.setDuration(0);        }        mLeftToRightAnimator = new AnimatorSet();        mLeftToRightAnimator.play(animator1).with(animator2).with(animator3);        mLeftToRightAnimator.play(animator4).with(animator5).with(animator6).after(animator1);        mLeftToRightAnimator.play(animator7).with(animator8).with(animator9).after(animator4);        mLeftToRightAnimator.addListener(new Animator.AnimatorListener() {            @Override            public void onAnimationStart(Animator animation) {                mIsScrolling = true;            }            @Override            public void onAnimationEnd(Animator animation) {                //mIsScrolling = false;            }            @Override            public void onAnimationCancel(Animator animation) {            }            @Override            public void onAnimationRepeat(Animator animation) {            }        });        mLeftToRightAnimator.start();}

好了,基本的动画效果就是这些了,其他细节就不贴代码了。

ScheduleView添加的子View焦点处理

@Override    public void clearAllFocus() {        mConfListView.clearFocus();        mLoginBtn.clearFocus();        updateAllFocus(false);        updateAllClickable(false);    }    @Override    public void requestFirstFocus() {        updateAllFocus(true);        updateAllClickable(true);        if (mPresenter.hasLogin()) {            mConfListView.requestFocus();        } else {            mLoginBtn.requestFocus();        }    }    private void updateAllFocus(boolean focus) {        mConfListView.setFocusable(focus);        mLoginBtn.setFocusable(focus);    }    private void updateAllClickable(boolean enabled) {        mConfListView.setEnabled(enabled);        mLoginBtn.setFocusable(enabled);    }

当ScheduleView偏离中间位置时,需要清楚当前界面所有的焦点并使其不能点击。
当ScheduleView旋转到中间的时候需要重新使其获取到焦点让其能够点击。

左右旋转控制

@Override    public boolean dispatchKeyEvent(KeyEvent event) {        int keyCode = event.geTKEyCode();        int action = event.getAction();        Log.d(TAG, "keyCode v = " + keyCode);        switch (keyCode) {            case KeyEvent.KEYCODE_DPAD_LEFT:                if (action == KeyEvent.ACTION_UP) {                    if (mCurrentItem == ITEMTAG.CALL && mCallView.isLastFocus(0)) {                        runLeftControl(true);                    } else if (mCurrentItem == ITEMTAG.CONTACTS && mContactsView.isLastFocus(0)) {                        runLeftControl(true);                    } else if (mCurrentItem == ITEMTAG.SCHEDULE) {                        runLeftControl(true);                    }                } else if (action == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {                    if (mCurrentItem == ITEMTAG.CALL) {                        mCallView.saveLastFocusId();                    }                }                break;            case KeyEvent.KEYCODE_DPAD_RIGHT:                if (action == KeyEvent.ACTION_UP) {                    if (mCurrentItem == ITEMTAG.CALL && mCallView.isLastFocus(1)) {                        runRightControl(true);                    } else if (mCurrentItem == ITEMTAG.CONTACTS && mContactsView.isLastFocus(1)) {                        runRightControl(true);                    } else if (mCurrentItem == ITEMTAG.SCHEDULE) {                        runRightControl(true);                    }                } else if (action == KeyEvent.ACTION_DOWN && event.getRepeatCount() == 0) {                    if (mCurrentItem == ITEMTAG.CALL) {                        mCallView.saveLastFocusId();                    }                }                break;            case KeyEvent.KEYCODE_MENU:                if (action == KeyEvent.ACTION_UP) {                    AnimatORManager.getInstance().shakeView(mTitleMenuView, 0.5f);                }                break;        }        return super.dispatchKeyEvent(event);    }

(1)处理方式是在监听遥控器的左右按键的UP事件,使其避免在Down时候处理旋转太快系统ANR
(2)如果界面中含有EditView,如果其在界面的边缘,那么左右按键就会和EditText有字符的时候就会对是否是最边沿的判断isLastFocus(0)产生影响。解决方案:

<Button            android:id="@+id/Go_left_btn"            android:layout_width="1dp"            android:layout_height="1dp"            android:background="@null"            android:clickable="false"            android:focusable="true" /><Button        android:id="@+id/go_right_btn"        android:layout_width="12dp"        android:layout_height="match_parent"        android:background="@null"        android:clickable="false"        android:focusable="true"        android:nextFocusLeft="@+id/et_search"        android:nextFocusRight="@+id/go_right_btn" />

在最左边go_left_btn和最右边go_right_btn添加隐形的btn,让其获取焦点,在左右按键UP的时候,焦点如果在两个按钮上就实行左右跳转,否则停留在当前界面。

感谢各位的阅读,以上就是“怎么实现Android TV 3D卡片无限循环效果”的内容了,经过本文的学习后,相信大家对怎么实现Android TV 3D卡片无限循环效果这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: 怎么实现Android TV 3D卡片无限循环效果

本文链接: https://www.lsjlt.com/news/304833.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android TV 3D卡片无限循环效果
    TV 3D卡片无限循环效果,供大家参考,具体内容如下 ##前言 1、需求:实现3个卡片实现无限循环效果:1-2-3-1-2-3-1…,而且要实现3D效果:中间突出,两侧呈角度显示 2...
    99+
    2024-04-02
  • 怎么实现Android TV 3D卡片无限循环效果
    这篇文章主要讲解了“怎么实现Android TV 3D卡片无限循环效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么实现Android TV 3D卡片无限循环效果”吧!##思路自定义Vi...
    99+
    2023-06-25
  • RecyclerView无限循环效果怎么实现
    这篇文章主要介绍“RecyclerView无限循环效果怎么实现”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“RecyclerView无限循环效果怎么实现”文章能帮助大家解决问题。1、修改adpter...
    99+
    2023-07-05
  • Unity ScrollView实现无限循环效果
    本文实例为大家分享了Unity ScrollView实现无限循环效果的具体代码,供大家参考,具体内容如下 在Unity引擎中ScrollView组件是一个使用率比较高的组件,该组件能...
    99+
    2024-04-02
  • Android ViewPager怎么去实现无限循环滚动回绕效果
    不懂Android ViewPager怎么去实现无限循环滚动回绕效果?其实想解决这个问题也不难,下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。android系统提供的ViewPager标准方式是左右可以自由滑动,但...
    99+
    2023-05-30
    android viewpager 滚动效果
  • Android ViewPager导航小圆点实现无限循环效果
    之前用View Pager做了一个图片切换的推荐栏(就类似与淘宝、头条客户端顶端的推荐信息栏),利用View Pager很快就能实现,但是一次无意间使用淘宝APP的时候,突然发现它的效果和我做的还不一样,淘宝APP的推荐栏可以左右无限循环切...
    99+
    2023-05-30
    viewpager 导航 无限循环
  • js怎么实现无限循环轮播图效果
    小编给大家分享一下js怎么实现无限循环轮播图效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!知识要点1.实现无限循环的原理:以...
    99+
    2024-04-02
  • CSS3怎么实现无限循环的无缝滚动效果
    这篇文章主要讲解了“CSS3怎么实现无限循环的无缝滚动效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS3怎么实现无限循环的无缝滚动效果”吧!1. 使用CSS3来实现若要用CSS3的属...
    99+
    2023-07-05
  • Unity ScrollView如何实现无限循环效果
    小编给大家分享一下Unity ScrollView如何实现无限循环效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体内容如下在Unity引擎中ScrollVi...
    99+
    2023-06-20
  • Android ViewPager如何实现无限循环轮播广告位Banner效果
    这篇文章将为大家详细讲解有关Android ViewPager如何实现无限循环轮播广告位Banner效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。现在一些app通常会在头部放一个广告位,底部放置一行小...
    99+
    2023-05-30
    android viewpager banner
  • Android实现横向无限循环滚动的单行弹幕效果
    本期将带领大家实现一个这样的效果,支持无限循环的单行弹幕效果。 实现思路分析 要实现上面的效果,我们先拆分下实现要素: 1、弹幕布局是从屏幕的右侧向左侧滚动,单个弹幕之间的间距是固...
    99+
    2024-04-02
  • Android中怎么利用ViewPager实现无限循环
    本篇文章为大家展示了Android中怎么利用ViewPager实现无限循环,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Android ViewPager实现无限循环的实例ViewPager自身并不...
    99+
    2023-05-31
    android viewpager
  • CSS3如何实现无限循环的滚动效果
    这篇文章主要讲解了“CSS3如何实现无限循环的滚动效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“CSS3如何实现无限循环的滚动效果”吧!1. 使用CSS3来实现若要用CSS3的属性实现的...
    99+
    2023-07-04
  • CSS如何实现卡片3D翻转效果
    这篇文章将为大家详细讲解有关CSS如何实现卡片3D翻转效果,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。效果:代码:html:<div class="main">...
    99+
    2023-06-08
  • C#怎么实现无限循环
    本篇内容主要讲解“C#怎么实现无限循环”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C#怎么实现无限循环”吧!循环控制语句循环控制语句更改执行的正常序列。当执行离开一个范围时,所有在该范围中创建...
    99+
    2023-06-17
  • Android如何实现通知消息水平播放、无限循环效果
    小编给大家分享一下Android如何实现通知消息水平播放、无限循环效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!先看效果图:这个效果也很常见,实现的方法也有很多,我是使用RecyclerView来实现的,觉得还是挺不错...
    99+
    2023-05-30
    android
  • Scala无限循环怎么实现
    本篇内容主要讲解“Scala无限循环怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Scala无限循环怎么实现”吧!有的时候,我们可能需要多次执行同一块代码。一般情况下,语句是按顺序执行的...
    99+
    2023-06-19
  • Android怎么实现无限循环和自动轮播
    要实现Android中的无限循环和自动轮播,可以使用ViewPager和PagerAdapter来实现。下面是实现的步骤:1. 创建...
    99+
    2023-10-18
    Android
  • Android怎么实现3D界面效果
    要实现3D界面效果,可以通过以下几种方法:1. 使用OpenGL ES:Android支持OpenGL ES库,可以使用OpenGL...
    99+
    2023-08-24
    Android
  • Unity实现卡片循环滚动效果的示例详解
    目录简介定义卡片的摆放规则调整卡片的层级关系调整卡片的尺寸大小动态调整位置、层级和大小移动动画按钮事件简介 功能需求如图所示,点击下一个按钮,所有卡片向右滚动,其中最后一张需要变更为...
    99+
    2022-12-09
    Unity卡片循环滚动效果 Unity循环滚动效果 Unity 滚动
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作