自定义Rotate3dView

本文介绍如何在Android中自定义一个3D翻转View,通过实现自定义的ViewGroup,利用属性动画和Camera API实现3D翻转效果。文章详细解释了如何通过Adapter模式加载正反面View,以及如何在dispatchDraw中使用Camera旋转子View。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自定义Rotate3dView

本文地址,转载请注明:https://blog.youkuaiyun.com/BenjaminFFF/article/details/82828289
github地址:https://github.com/BenjaminFF/Rotate3dView

知识准备

  • Android自定义ViewGroup的知识。
  • Android事件传递机制。
  • Android Camera。
  • Android属性动画

Android Camera参考GscSloop的这篇文章
Android属性动画参考郭霖的这篇文章

效果:

在这里插入图片描述

初始化View

准备两个View,一个正面,一个反面。然后添加到Rotate3dView里面。这里模仿了RecyclerView的Adapter,思路如下:
先定义一个抽象类,里面有一些抽象方法:

public abstract static class Adapter<FrontVH extends ViewHolder,BackVH extends ViewHolder>{
        public abstract FrontVH onCreateFrontViewHolder(ViewGroup parent);
        public abstract void onBindFrontViewHolder(FrontVH holder);

        public abstract BackVH onCreateBackViewHolder(ViewGroup parent);
        public abstract void onBindBackViewHolder(BackVH holder);
        
        ......
}

    public abstract static class ViewHolder{
        public View itemView;

        public ViewHolder(View itemView) {
            this.itemView = itemView;
        }
    }

通过实现Adapter和它里面的这些方法,起到载入数据的作用。

然后在setAdapter里面做功夫:

private void addViewFromAdapter(){
        ViewHolder frontHolder=mAdapter.CreateFrontViewHolder(this);
        mAdapter.onBindFrontViewHolder(frontHolder);

        ViewHolder backHolder=mAdapter.CreateBackViewHolde
基于谷歌官方提供的3D翻转示例进行修改,修复了在不同设备上显示效果差异过大的问题。项目地址:https://github.com/GcsSloop/Rotate3dAnimation 效果图:如何使用:// 计算中心点(这里是使用view的中心作为旋转的中心点)         final float centerX = view.getWidth() / 2.0f;                 final float centerY = view.getHeight() / 2.0f;        //括号内参数分别为(上下文,开始角度,结束角度,x轴中心点,y轴中心点,深度,是否扭曲)         final Rotate3dAnimation rotation = new Rotate3dAnimation(this, start, end, centerX, centerY, 1.0f, true);         rotation.setDuration(1500);                               //设置动画时长         rotation.setFillAfter(true);                              //保持旋转后效果         rotation.setInterpolator(new AccelerateInterpolator());   //设置插值器         rotation.setAnimationListener(new AnimationListener() {   //设置监听器             @Override             public void onAnimationStart(Animation animation) {             }            @Override             public void onAnimationRepeat(Animation animation) {             }            @Override             public void onAnimationEnd(Animation animation) {             }         });         view.startAnimation(rotation);                            //开始动画
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值