首页 > 其他分享 >qq打卡功能实现--卡片切换反转效果

qq打卡功能实现--卡片切换反转效果

时间:2024-10-27 19:45:36浏览次数:7  
标签:qq 动画 -- void animation 打卡 public Animator

今天实现了一个类似qq的打卡反转效果,效果图如下(卡片样式比较简陋大家可以自己美化一下),快来看看怎么实现的吧

先写两个layout显示卡片部分

分别写打卡前的卡片样式(包括按钮)和打卡后显示的卡片,代码如下

打卡前(cardbefore.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="80dp"

        android:layout_gravity="center_horizontal">
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="330dp"
                android:layout_height="500dp"
                android:layout_marginTop="30dp"
                android:layout_marginLeft="30dp"
                android:layout_marginRight="30dp"
                android:layout_gravity="center_horizontal"
                android:background="@drawable/clock_in"
                />
        </FrameLayout>
        <android.widget.Button
            android:id="@+id/button_clock_in"
            android:layout_width="150dp"
            android:layout_height="50dp"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="420dp"
            android:background="@drawable/btn_clock_in"
            android:text="立即打卡"
            android:textColor="#000000"
            android:textSize="20dp"
            android:textStyle="bold" />

    </FrameLayout>
</LinearLayout>

打卡后(cardafter.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <FrameLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="80dp"

        android:layout_gravity="center_horizontal">
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/cardafter"
                android:gravity="center"
                android:textStyle="bold|italic"
                android:textColor="#FFFFFF"
                android:layout_width="330dp"
                android:layout_height="500dp"
                android:layout_marginTop="30dp"
                android:layout_marginLeft="30dp"
                android:layout_marginRight="30dp"
                android:text="追风赶月莫停留,平芜尽处是春山"
                android:textSize="22sp"
                android:layout_gravity="center_horizontal"
                android:background="@drawable/dahai"
                />

        </FrameLayout>


    </FrameLayout>
</LinearLayout>

打卡页面布局文件

这个layout文件是打卡页面的整体布局,其中引入了上面两个布局文件,先将打卡前的布局显示出来,打卡后的隐藏起来,代码如下

打卡页面整体布局(activity_daka.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/background_1"
    android:orientation="vertical"
    tools:context=".daka">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="80dp"
        android:background="#FFFFFF">

        <TextView
            android:layout_width="55dp"
            android:layout_height="50dp"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="15dp"
            android:background="@mipmap/turn_left"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="励志打卡"
            android:textSize="30dp"
            android:textStyle="bold"
            android:layout_gravity="center"/>
    </FrameLayout>
    <include layout="@layout/cardbefore"
    android:id="@+id/a1"
    android:visibility="visible"/>
    <include layout="@layout/cardafter"
        android:id="@+id/a2"
        android:visibility="gone"/>

</LinearLayout>

在activity中实现旋转效果

这段代码创建了一个Android活动,其中包含两个线性布局和一个按钮,当按钮被点击时,会触发两个线性布局的3D旋转动画,一个隐藏,另一个显示。

打卡页面activity(daka.java)

package com.example.depressed;

import android.animation.Animator;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.os.Bundle;

import androidx.appcompat.app.AppCompatActivity;

import android.view.View;
import android.widget.Button;
import android.widget.LinearLayout;

public class daka extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_daka);

        final LinearLayout a1 = findViewById(R.id.a1);
        final LinearLayout a2 = findViewById(R.id.a2);
        Button buttonClockIn = findViewById(R.id.button_clock_in);

        buttonClockIn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // 创建a1的旋转动画
                ObjectAnimator rotationAnimator1 = ObjectAnimator.ofFloat(a1, "rotationY", 0f, -90f);
                rotationAnimator1.setDuration(300);

                // 创建a2的旋转动画
                ObjectAnimator rotationAnimator2 = ObjectAnimator.ofFloat(a2, "rotationY", 90f, 0f);
                rotationAnimator2.setDuration(500);

                // 创建AnimatorSet来管理动画
                AnimatorSet animatorSet = new AnimatorSet();

                // 将两个动画添加到AnimatorSet中,并设置它们按顺序播放
                animatorSet.playSequentially(rotationAnimator1, rotationAnimator2);

                // 设置动画监听器,以便在第一个动画结束后隐藏a1
                rotationAnimator1.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                        // 当第一个动画开始时,不做任何操作
                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                        // 当第一个动画结束时,隐藏a1
                        a1.setVisibility(View.GONE);
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {
                        // 当动画被取消时,不做任何操作
                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {
                        // 当动画重复时,不做任何操作
                    }
                });

                // 开始播放动画
                animatorSet.start();

                // 设置a2在动画开始前不可见
                a2.setVisibility(View.INVISIBLE);
                // 在第一个动画结束后,a2变为可见
                rotationAnimator1.addListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                        // 动画开始时不执行任何操作
                    }

                    @Override
                    public void onAnimationEnd(Animator animation) {
                        a2.setVisibility(View.VISIBLE);
                    }

                    @Override
                    public void onAnimationCancel(Animator animation) {
                        // 动画取消时不执行任何操作
                    }

                    @Override
                    public void onAnimationRepeat(Animator animation) {
                        // 动画重复时不执行任何操作
                    }
                });
            }
        });
    }
}

根据以上步骤就可以实现类似qq打卡的翻转效果啦,快来试试吧~

标签:qq,动画,--,void,animation,打卡,public,Animator
From: https://blog.csdn.net/2301_80743865/article/details/143272700

相关文章

  • Harmonyg环境使用ORM开发数据库应用入门教程
    Harmony环境使用Bee入门向导一、添加jar包将bee相关的3个jar包复制到entry包下的libs目录,右击jar包,选择:AddasLibray… , 在跳出的对话框中选择ok.二、将相关配置注册到Bee在启动的Ability,添加相应的配置和注册信息。 若有自定义的配置在bee.properties则需要;......
  • Shodan 进阶使用技巧:无高级会员如何搜索指定漏洞并进行批量验证
    内容预览≧∀≦ゞShodan进阶使用之批量查找并验证漏洞声明导语一、漏洞信息收集二、构建Shodan搜索语句1.指定端口2.指定操作系统3.指定漏洞条件4.完整Shodan查询语句三、验证目标设备的漏洞状态示例验证命令四、使用Shodan批量下载与解析漏洞数据下载搜索......
  • Econ7810: Econometrics for Economic Analysis,
    Econ7810: Econometrics for Economic Analysis, Fall 2024Homework #2Due date: 28 October. 2024; 9am.Do not copy and paste the  answers from your classmates.   Two  identical homework  will  be  treated  as cheat......
  • CSP-J/S 2024 游寄
    满纸荒唐言,一把辛酸泪。其实不是去年没去,只是去年复赛喜提15pts荣获四等奖,木有获奖证书。今年决定一雪前耻!坐标:窄西省浅圳市某郊区(。该区是弱区,目前已知的唯一一个官方承认的(不包括我的省四)复赛获奖选手是CSP-J2022以90pts的高分荣获三等奖(T1一个红题没AC?这是咋过初......
  • Economics 360 Data Analysis Project
    Economics360DataAnalysisProjectFall2024Forthisproject,studentswillapplythemethodsfromclassto a real set of data. Below are the milestonesatwhichstudentsareexpectedtohavetangibleprogresstowards completion.Critical Due D......
  • STL学习
    手写STL源码模板//TemplateDemo#include<iostream>usingnamespacestd;//交换两个变量voidMySwap(int&a,int&b){ inttemp=a; a=b; b=temp;}//使用模板--自适应类型生成函数,地址不同//函数重载和模板函数冲突,优先调用普通函数,或者使用<T>()显示调用//不......
  • MySQL的自增ID用完了应该怎么办
    一种解决方法是使用BIGINT数据类型。BIGINT数据类型的最大值是9223372036854775807,这比INT数据类型大得多。如果您使用BIGINT数据类型来存储自增ID,那么您的表可以插入更多的数据。一、MySQL的自增ID用完了应该怎么办解决方案1:使用BIGINT数据类型一种解决方法是使用BIGINT数......
  • PHP中的错误处理最佳实践
    在PHP中,错误处理最佳实践包括错误日志记录、使用异常处理机制、设置自定义错误处理器,和配置错误报告级别。其中,使用异常处理机制可以让代码更加健壯,并且易于调试。异常处理允许开发者将错误处理代码与业务逻辑分离,使得后者更清晰,更准确地反映出程序应有的流程。通过抛出异常,代码......
  • 1-petalinux2018.3摸索记录-petalinux-config
    1-petalinux2018.3摸索记录-petalinux-config一、petalinux-config的具体配置-ZYNQMPConfiguration​​1、LinuxCompomentSelection​​LinuxCompomentSelection,Linux组件选择.FirstStageBootloader和Autoupdateps_init勾选会自动生成fsbl.elf,自动更新ps_i......
  • CSP2024游记
    发现很久没有写游记了!为什么呢,大概是中间的apio和noi都烂完了吧,这次csp虽然也不太行,但是毕竟没有到崩盘的地步,还是写一下罢。Day-1发生一些神秘的事情,不好评价。Day0下午在机房测试了frc,没有出问题。RoFtaCD的代码收不上去,他在主目录下建了个叫noi的文件夹,原来主......