这个交互也太炸裂了趴

2023-05-16

动画是为一个app创造出色用户体验的重要组成部分。 它的关键挑战是向用户解释应用程序的逻辑,但是常见的错误是鲁莽地使用动画,从而否定了改善用户体验的整个观点。 为了使应用出色而不仅仅是出色或平庸,动画必须正确集成并且不应多余。

在本文中,您将了解如何使用ScrollView和react-native的Animated API创建标题动画。在文章结尾之后,我们将获得以下输出

图1

How it works?

在ScrollView上渲染标头,并将ScrollView的顶部位置设置为标头的偏移量。然后,我们可以简单地使用ScrollView滚动位置插入标头。因此,让我们了解一下。

Let’s Code

我们使用Interpolate来更改位置,大小,颜色和Animated.event(),以将ScrollView位置与动画状态值进行映射。您可以阅读有关Interpolate(https://animationbook.codedaily.io/interpolation)和Animated.event(https://animationbook.codedaily.io/animated-event/)的更多详细信息。

始终在动画配置中设置useNativeDriver:true。通过跳过每个渲染帧的JS代码和本机代码之间的桥梁,可以使动画流畅。

  • 由于React-Native的限制,seNativeDriver当前不支持绝对位置。为此,我们使用了transform属性。对于顶部,我们使用translateY,对于左边,我们使用translateX。

使用来自构造函数的动画值初始化状态scrollY,如下所示:

constructor(props) {        
   super(props);       
   this.state = {            
       scrollY: new Animated.Value(0)        
    };    
}

现在我们不希望组件重新呈现,因此我们不使用setState()方法。我们使用ScrollView的onScroll属性来映射带有滚动位置的状态:

<Animated.ScrollView
    overScrollMode={'never'}                    
    style={{zIndex: 10}}
    scrollEventThrottle={16}                    
    onScroll={Animated.event(
        [
          {
             nativeEvent: {contentOffset:{y:this.state.scrollY}}
          }
        ]
    )}>
      //child here
</Animated.ScrollView>

Animated.event()方法使用ScrollView的Y偏移量映射状态scrollY表示垂直偏移量。

scrollEventThrottle 控制滚动时触发滚动事件的频率(以毫秒为单位的时间间隔)。 较小的数字可提高跟踪滚动位置的代码的准确性,但由于通过网桥发送的信息量大,因此可能导致滚动性能问题。 当JS运行循环同步到屏幕刷新率时,您不会注意到在1-16之间设置的值之间存在差异。

现在是时候对轮廓图像进行动画处理了,以借助Interpolation从屏幕中间到左侧标题进行动画处理。

//artist profile image position from left
_getImageLeftPosition = () => {
    const {scrollY} = this.state;

    return scrollY.interpolate({
        inputRange: [0, 80, 140],
        outputRange: [ThemeUtils.relativeWidth(30), ThemeUtils.relativeWidth(38), ThemeUtils.relativeWidth(10)],
        extrapolate: 'clamp',
        useNativeDriver: true
    });
};

可以先通过插值来运行每个属性。 插值通常使用线性插值将输入范围映射到输出范围,但还支持缓动功能。 默认情况下,它将外推曲线超出给定的范围,但是您也可以将其钳制输出值。

在这里,从输入范围0–80,我们的图像将相对于设备宽度的位置从30更改为38,从80–140则将相对位置更改为38至10。
当状态值从我们之前完成的ScrollView的onScroll映射更改时调用的插值方法。

//artist profile image position from top
_getImageTopPosition = () => {
    const {scrollY} = this.state;

    return scrollY.interpolate({
        inputRange: [0, 140],
        outputRange: [ThemeUtils.relativeHeight(20), Platform.OS === 'ios' ? 8 : 10],
        extrapolate: 'clamp',
        useNativeDriver: true
    });
};

 //artist profile image width
  _getImageWidth = () => {
      const {scrollY} = this.state;

      return scrollY.interpolate({
          inputRange: [0, 140],
          outputRange: [ThemeUtils.relativeWidth(40), ThemeUtils.APPBAR_HEIGHT - 20],
          extrapolate: 'clamp',
          useNativeDriver: true
      });
  };

  //artist profile image height
  _getImageHeight = () => {
      const {scrollY} = this.state;

      return scrollY.interpolate({
          inputRange: [0, 140],
          outputRange: [ThemeUtils.relativeWidth(40), ThemeUtils.APPBAR_HEIGHT - 20],
          extrapolate: 'clamp',
          useNativeDriver: true
      });
  };

与左位置相同,我们将位置设置为top,根据ScrollView的滚动位置设置图像的高度和宽度。现在,以Animated.Image的样式设置这些值,如下所示:

render() {
    const profileImageLeft = this._getImageLeftPosition();
    const profileImageTop = this._getImageTopPosition();
    const profileImageWidth = this._getImageWidth();
    const profileImageHeight = this._getImageHeight();

return(
      <Animated.Image
            style={
                [styles.profileImage, {
                borderRadius: (ThemeUtils.APPBAR_HEIGHT - 20) / 2,
                height: profileImageHeight,
                width: profileImageWidth,
                transform: [
                       {translateY: profileImageTop},
                       {translateX: profileImageLeft}
                    ]
                }]}
                source={profileImage}
      />
    );
}

现在,当用户滚动ScrollView时,将调用onScroll方法,我们的状态scrollY将更改,并且当stateY更改后,将调用内插法,并且完成了精美的动画。
在当前示例中,我使用了许多插值值,例如图像边框宽度,图像边框颜色,标题不透明度等。所有方法都在滚动位置映射的相同原理下工作。

最终代码:

import React, {Component, PureComponent} from 'react';
import {
    Animated,
    View,
    StatusBar,
    Text,
    Image,
    Platform,
    StyleSheet,
    Linking,
    TouchableOpacity,
} from 'react-native';

/*Data*/
import artistData from './assets/data/SongData.json';
import MaterialAnimatedView from './MaterialAnimatedView';
import {HTouchable} from '../../components/HTouchable';
import {Navigation, Options} from 'react-native-navigation';
import {MyColors} from '../../config/Colors';
import {ThemeUtils} from './utils/ThemeUtils';
const ARTIST_NAME = 'Villa_Mou';
const coverImage = require('./assets/images/bg.png');
const profileImage = require('./assets/images/icon.png');
const backImage = require('./assets/images/back.png');

interface Props {
    componentId: string;
}
interface State {
    scrollY: any;
}
/**
 * 图片高度 屏幕30%
 */
const HEADER_IMAGE_HEIGHT = ThemeUtils.relativeHeight(30);
export default class ArtistScreen extends PureComponent<Props, State> {
    static options(): Options {
        return {
            topBar: {
                visible: false,
            },
            statusBar: {drawBehind: true, style: 'light', backgroundColor: 'rgba(0,0,0,0.4)'},
        };
    }
    constructor(props) {
        super(props);
        this.state = {
            scrollY: new Animated.Value(0),
        };
    }

    render() {
        return (
            <View style={styles.container}>
                {this.renderHeaderImageBg()}
                {this.renderHeader()}
                {this.renderUserIcon()}
                {this.renderVipCard()}
                {this.renderList()}
            </View>
        );
    }

    private renderVipCard = () => {
        const top = this._getVipCardTop();
        const opacity = this._getVipCardOpacity();
        return (
            <Animated.View
                style={{
                    height: 50,
                    backgroundColor: MyColors.BLACK,
                    position: 'absolute',
                    top: top,
                    left: 25,
                    right: 25,
                    justifyContent: 'center',
                    paddingLeft: 15,
                    borderTopLeftRadius: 6,
                    borderTopRightRadius: 6,
                    opacity,
                }}>
                <Text style={{color: '#744307', fontWeight: 'bold', fontSize: 16}}>专属VIP卡</Text>
            </Animated.View>
        );
    };

    private renderList = () => {
        const listViewTop = this._getListViewTopPosition();
        const normalTitleOpacity = this._getNormalTitleOpacity();
        return (
            <Animated.ScrollView
                overScrollMode={'never'}
                style={{zIndex: 10}}
                scrollEventThrottle={16}
                onScroll={Animated.event([
                    {
                        nativeEvent: {contentOffset: {y: this.state.scrollY}},
                    },
                ])}>
                <Animated.Text
                    style={[
                        styles.profileTitle,
                        {
                            opacity: normalTitleOpacity,
                        },
                    ]}>
                    {ARTIST_NAME}
                </Animated.Text>

                <Animated.View
                    style={{
                        transform: [
                            {
                                translateY: listViewTop,
                            },
                        ],
                    }}>
                    {artistData.map((item, index) => this.renderItem(index, item))}
                </Animated.View>
            </Animated.ScrollView>
        );
    };

    private renderUserIcon = () => {
        const profileImageLeft = this._getImageLeftPosition();

        const profileImageTop = this._getImageTopPosition();

        const profileImageWidth = this._getImageWidth();

        const profileImageHeight = this._getImageHeight();

        const profileImageBorderWidth = this._getImageBorderWidth();

        const profileImageBorderColor = this._getImageBorderColor();
        return (
            <Animated.Image
                style={[
                    styles.profileImage,
                    {
                        borderWidth: profileImageBorderWidth,
                        borderColor: profileImageBorderColor,
                        borderRadius: (ThemeUtils.APPBAR_HEIGHT - 20) / 2,
                        height: profileImageHeight,
                        width: profileImageWidth,
                        transform: [{translateY: profileImageTop}, {translateX: profileImageLeft}],
                    },
                ]}
                source={profileImage}
            />
        );
    };

    private renderHeaderImageBg = () => {
        const headerImageOpacity = this._getHeaderImageOpacity();
        return (
            <Animated.Image
                style={[
                    styles.headerImageStyle,
                    {
                        opacity: headerImageOpacity,
                    },
                ]}
                source={coverImage}
            />
        );
    };

    private renderHeader = () => {
        const headerBackgroundColor = this._getHeaderBackgroundColor();
        const headerTitleOpacity = this._getHeaderTitleOpacity();
        return (
            <View>
                {Platform.OS === 'android' && (
                    <Animated.View
                        style={{
                            height: StatusBar.currentHeight,
                            backgroundColor: headerBackgroundColor,
                        }}
                    />
                )}
                <Animated.View
                    style={[
                        styles.headerStyle,
                        {
                            backgroundColor: headerBackgroundColor,
                        },
                    ]}>
                    <HTouchable
                        style={styles.headerLeftIcon}
                        onPress={() => {
                            Navigation.pop(this.props.componentId);
                        }}>
                        <Image source={backImage} />
                    </HTouchable>

                    <Animated.Text
                        style={[
                            styles.headerTitle,
                            {
                                opacity: headerTitleOpacity,
                            },
                        ]}>
                        {ARTIST_NAME}
                    </Animated.Text>
                </Animated.View>
            </View>
        );
    };

    renderItem = (index, item) => {
        return (
            <MaterialAnimatedView key={index.toString()} index={index}>
                <HTouchable style={styles.artistCardContainerStyle} onPress={() => {}}>
                    <Image source={{uri: item.artistImage}} style={styles.artistImage} />
                    <View style={styles.cardTextContainer}>
                        <Text numberOfLines={1} style={styles.songTitleStyle}>
                            {item.songName}
                        </Text>
                        <Text numberOfLines={1}>{item.albumName}</Text>
                    </View>
                </HTouchable>
            </MaterialAnimatedView>
        );
    };

    // scrollY从 0到 140 ,颜色从透明到黑色
    _getHeaderBackgroundColor = () => {
        const {scrollY} = this.state;

        return scrollY.interpolate({
            inputRange: [0, 140],
            outputRange: ['rgba(0,0,0,0.0)', MyColors.BLACK],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };

    //scrollY从 0到 140 ,透明度从1到0
    _getHeaderImageOpacity = () => {
        const {scrollY} = this.state;

        return scrollY.interpolate({
            inputRange: [0, 140],
            outputRange: [1, 0],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };

    //artist profile image position from left
    _getImageLeftPosition = () => {
        const {scrollY} = this.state;

        return scrollY.interpolate({
            inputRange: [0, 80, 140],
            outputRange: [
                ThemeUtils.relativeWidth(35),
                ThemeUtils.relativeWidth(38),
                ThemeUtils.relativeWidth(12),
            ],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };

    //artist profile image position from top
    _getImageTopPosition = () => {
        const {scrollY} = this.state;

        return scrollY.interpolate({
            inputRange: [0, 140],
            outputRange: [
                ThemeUtils.relativeHeight(20),
                Platform.OS === 'ios' ? 8 : 10 + StatusBar.currentHeight,
            ],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };

    //artist profile image width
    _getImageWidth = () => {
        const {scrollY} = this.state;

        return scrollY.interpolate({
            inputRange: [0, 140],
            outputRange: [ThemeUtils.relativeWidth(30), ThemeUtils.APPBAR_HEIGHT - 20],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };

    //artist profile image height
    _getImageHeight = () => {
        const {scrollY} = this.state;

        return scrollY.interpolate({
            inputRange: [0, 140],
            outputRange: [ThemeUtils.relativeWidth(30), ThemeUtils.APPBAR_HEIGHT - 20],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };

    //artist profile image border width
    _getImageBorderWidth = () => {
        const {scrollY} = this.state;

        return scrollY.interpolate({
            inputRange: [0, 140],
            outputRange: [StyleSheet.hairlineWidth * 3, StyleSheet.hairlineWidth],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };

    //artist profile image border color
    _getImageBorderColor = () => {
        const {scrollY} = this.state;

        return scrollY.interpolate({
            inputRange: [0, 140],
            outputRange: [MyColors.CARD_BG_COLOR, 'rgba(255,255,255,1)'],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };

    _getVipCardTop = () => {
        const {scrollY} = this.state;
        return scrollY.interpolate({
            inputRange: [0, 50],
            outputRange: [ThemeUtils.relativeHeight(37), ThemeUtils.relativeHeight(30)],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };

    _getVipCardOpacity = () => {
        const {scrollY} = this.state;
        return scrollY.interpolate({
            inputRange: [0, 50, 60],
            outputRange: [1, 1, 0],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };

    //Song list container position from top
    _getListViewTopPosition = () => {
        const {scrollY} = this.state;
        //TODO:   高度待处理
        return scrollY.interpolate({
            inputRange: [0, 250],
            outputRange: [ThemeUtils.relativeHeight(100) - ThemeUtils.relativeHeight(70), 0],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };

    //header title opacity
    _getHeaderTitleOpacity = () => {
        const {scrollY} = this.state;

        return scrollY.interpolate({
            inputRange: [0, 20, 50],
            outputRange: [0, 0.5, 1],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };

    //artist name opacity
    _getNormalTitleOpacity = () => {
        const {scrollY} = this.state;

        return scrollY.interpolate({
            inputRange: [0, 20, 30],
            outputRange: [1, 0.5, 0],
            extrapolate: 'clamp',
            useNativeDriver: true,
        });
    };
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        backgroundColor: 'white',
    },
    /*header style*/
    headerLeftIcon: {
        position: 'absolute',
        left: ThemeUtils.relativeWidth(2),
    },
    headerRightIcon: {
        position: 'absolute',
        right: ThemeUtils.relativeWidth(2),
    },
    headerStyle: {
        height: ThemeUtils.APPBAR_HEIGHT,
        width: '100%',
        alignItems: 'center',
        justifyContent: 'center',
    },
    headerTitle: {
        textAlign: 'center',
        justifyContent: 'center',
        color: MyColors.HEADER_TEXT_COLOR,
        fontSize: ThemeUtils.fontNormal,
        fontWeight: 'bold',
    },
    /*Top Image Style*/
    headerImageStyle: {
        height: HEADER_IMAGE_HEIGHT,
        width: '100%',
        top: 0,
        alignSelf: 'center',
        position: 'absolute',
    },
    /*profile image style*/
    profileImage: {
        position: 'absolute',
        zIndex: 100,
    },
    /*profile title style*/
    profileTitle: {
        textAlign: 'center',
        color: MyColors.white,
        top: ThemeUtils.relativeHeight(29),
        left: 0,
        fontWeight: 'bold',
        right: 0,
        fontSize: 20,
    },
    /*song count text style*/
    songCountStyle: {
        position: 'absolute',
        textAlign: 'center',
        fontWeight: '400',
        top: ThemeUtils.relativeHeight(40),
        left: 0,
        right: 0,
        fontSize: ThemeUtils.fontNormal,
    },
    artistCardContainerStyle: {
        backgroundColor: MyColors.CARD_BG_COLOR,
        elevation: 5,
        shadowRadius: 3,
        shadowOffset: {
            width: 3,
            height: 3,
        },
        paddingVertical: 5,
        paddingHorizontal: 15,
        borderRadius: 6,
        marginBottom: 5,
        marginHorizontal: 15,
        flexDirection: 'row',
        alignItems: 'center',
    },
    artistImage: {
        height: ThemeUtils.relativeWidth(15),
        width: ThemeUtils.relativeWidth(15),
        borderRadius: ThemeUtils.relativeWidth(7.5),
        borderWidth: 1,
    },
    songTitleStyle: {
        fontSize: ThemeUtils.fontNormal,
        color: MyColors.BLACK,
    },
    cardTextContainer: {
        flex: 1,
        margin: ThemeUtils.relativeWidth(3),
    },
});

当然可能还存在部分适配问题,这个需要花时间去调一下,希望你喜欢这篇文章哦

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

这个交互也太炸裂了趴 的相关文章

  • 黑苹果详细安装教程-基于OpenCore官网指导-UPUPMO(macOS Monterey)

    文章大纲 01 必备知识 02 作者当前硬件说明 03 主板 BIOS 版本升级 04 确定声卡 网卡信息 05 配置 EFI 驱动 06 配置 ACPI xff08 SSDTs xff09 07 配置 config plist 08 制作
  • 各品牌电脑PE中找不到硬盘的解决方法

    大部分小伙伴遇到系统坏了之后 xff0c 都会自己使用u盘进入pe装系统 xff0c 但是在u盘装系统过程中却容易遇到问题 xff0c 特别是PE中找不到硬盘的情况 xff0c 大家遇到这种情况该怎么解决呢 xff0c 所以今天跟着快启动小
  • Python爬虫实战: 多进程爬取百度百科页面超链接

    Python爬虫实战 多进程爬取百度百科页面超链接 最近因为需要 xff0c 爬取了实体知识库里每个实体在百度百科页面下的所有超链接内容 xff0c 这部分工作结束后 xff0c 想着既是总结也是分享 xff0c 把这部分工作和代码记录下来
  • Hugging face快速入门

    Hugging face Introduction Hugging face 是一家总部位于纽约的聊天机器人初创服务商 xff0c 开发的应用在青少年中颇受欢迎 xff0c 相比于其他公司 xff0c Hugging Face更加注重产品带
  • Nginx(二)初识配置文件【简单认识】

    版本 xff1a nginx x86 64 1 1 14 0 1 el7 4 ngx cat nginx conf 定义Nginx运行的用户和用户组 user nginx nginx进程数 xff0c 建议设置为等于CPU总核心数 work
  • MacBookM1远程连接云服务器安装boche+pintos

    1 前言 因为M1芯片的缘故 xff0c 没法直接在虚拟机 xff08 PD VMware xff09 上操作实验 xff0c 故出此下策 如果有条件还是希望uu们在装配有windows系统的笔记本上操作 此方法基于远程连接 xff0c 因
  • Vmware 实现自动\开机启动\关机挂起

    1 编写脚本 start bat ping 127 0 0 1 n 5 设置登录后 过几秒钟再启动虚拟机 34 C Program Files x86 VMware VMware Workstation vmrun exe 34 start
  • Python爬虫——BeautifulSoup的基本使用

    Python爬虫 BeautifulSoup的基本使用 安装beautifulsoup4模块 pip span class token function install span beautifulsoup4 1 创建BeautifulSo
  • python环境:本地有网服务器的python环境,迁移到离线服务器

    A服务器的虚拟环境 xff0c 迁移到离线服务器B xff08 已安装好anaconda xff09 设 xff1a A服务器的虚拟环境名称为 xff1a flask env 创建虚拟环境 在A服务器data01目录下 使用mkdir创建目
  • ROI管理与客户需求管理

    转自 xff1a http semwatch org 2010 02 roi management and client demand 作者 xff1a Gaoge 日期 xff1a 二月 26 2010 分类 xff1a 付费搜索SEM
  • 人脸识别过程

    做人脸识别的朋友很多不知道人脸识别过程 xff0c 人脸识别厂家人脸识别过程 人脸识别第一步先进行图像采集 xff0c 人脸定位 xff0c 特征提取 xff0c 特征对比 xff0c 人脸资料存储 xff0c 识别成功就可以开门 xff0
  • 个人博客的三种方式

    创建个人博客的三种方式 1 博客平台 简书 CSDN 知乎专栏等 特点 xff1a 简单 xff0c 可控性低 申请个账号就可以写 xff0c 其他的都不用管 限制多 xff0c 界面 排版 有没有广告自己说了不算 xff0c 什么能发什么
  • GitHub 简介

    用详细的图文对GitHub进行简单的介绍 git是一个版本控制工具 xff0c github是一个用git做版本控制的项目托管平台 主页介绍 xff1a overview xff1a 总览 相当于个人主页 repositories xff1
  • Markdown 编辑器推荐和常用语法介绍

    Markdown 是非常好用的文档编写方式 下面是我的 Markdown 学习总结 不求详尽 xff0c 只求简明 编辑器 xff1a 我目前使用的 Markdown 编辑器是 Joplin xff0c 感觉挺好用 我对编辑器的需求是 xf
  • 使用 Hexo 在 Github 上建博客

    先确认 git 与 npm 已经安装 xff0c 在终端输入以下命令 git version npm version 安装 hexo xff0c 在终端输入 npm install hexo cli g 安装过程中如果报错 解决方法 xff
  • ping命令的过程

    ping命令的过程 1 ping是什么 xff1f PING Packet Internet Groper xff0c 因特网包探索器 xff0c 用于测试网络连通性的程序 Ping发送一个ICMP Internet Control Mes
  • Hexo 更换主题

    更换 Hexo 主题非常容易 xff0c 只要在 themes 文件夹内 xff0c 新增一个任意名称的文件夹 xff0c 并修改 config yml 内的 theme 设定 xff0c 即可切换主题 具体步骤 xff1a 1 安装主题
  • Python 爬虫零基础教程(0):简介及准备

    其他的教程往往从语法开始 xff0c 而我们直接开始爬虫 xff0c 语法等知识边做边学 这第0篇我们简单介绍下爬虫和编程工具 爬虫是什么 爬虫是自动浏览 保存网页内容的程序或脚本 爬虫不同于黑客 xff0c 爬虫爬取的是允许访问的内容 工
  • 如何解决Unable to parse template "Interface"Error Message;

    Unable to parse template Interface Error Message This Template did not Produce a Java Class or an interface关于这个错误 xff0c

随机推荐

  • inflate函数使用总结

    inflate 两个参数和三个参数的区别 以前使用没有关注过 xff0c 因为觉得没报bug就行了 xff0c 两个三个参数无所谓 xff0c 经过导师提醒 xff0c 决定好好看看源码和相关知识 xff0c 总觉一下区别 xff0c 以免
  • 除了csdn网站打不开,一直刷新等待没反应,其他网站都能正常访问

    DNS错误 自动获取DNS服务器地址 清除DNS缓存信息 ipconfig span class token operator span flushdns 重置winsock 目录设置 netsh winsock reset
  • org.slf4j用法

    org slf4j用法 Scala 1 创建Logger对象 private val logger Logger 61 LoggerFactory getLogger classOf HttpBmlClient 2 打印错误信息 同时抛出异
  • 安装图形界面、VNCserver

    centos7 安装图形界面 xff1a 第一步 xff1a 安装Gnome包 在命令行下 输入下面的命令来安装Gnome包 yumgroupinstall 34 GNOMEDesktop 34 34 GraphicalAdministra
  • MySQL全量、增量备份与恢复的简单方法

    本文主要给大家介绍MySQL全量 增量备份与恢复的简单方法 xff0c 文章内容都是笔者用心摘选和编辑的 xff0c 具有一定的针对性 xff0c 对大家的参考意义还是比较大的 xff0c 下面跟笔者一起了解下MySQL全量 增量备份与恢复
  • windows安装zabbix代理

    一 关闭windows防火墙或者开通10050和10051端口 直接windows关闭防火墙或者在防火墙中放行10050和10051 二 xff0e 下载 安装并修改windows代理 1 下载zabbix agentd包 官网下载地址 x
  • android8.0 Fingerprint 指纹输错5次后亮屏显示错误信息

    当有指纹解锁时 xff0c 会执行AuthenticationClient java gt onAuthenticated 一直在监听解锁行为 64 Override public boolean onAuthenticated int f
  • secureCRT 抓取串口数据

    language 61 34 VBScript 34 interface 61 34 1 0 34 Dim outputFile fout Dim outputPath Dim user outputPath 61 34 D out txt
  • 2022年编程语言热度排行榜来啦,快来看看你学习的语言排第几

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 前言 一直以来 xff0c 编程语言都是程序员非常关注的话题 年末将至 xff0c 是否会有程序员发出疑问 2022 年行业需求最大的编程
  • LibEvent-Demo

    libevent test cpp 定义控制台应用程序的入口点 include 34 stdafx h 34 pragma comment lib 34 ws2 32 lib 34 pragma comment lib 34 wsock32
  • 【数据挖掘】DBSCAN聚类算法(python实现)

    一 python代码 39 39 39 Author Vici date 2020 5 14 39 39 39 import math 39 39 39 Point类 xff0c 记录坐标x xff0c y和点的名字id 39 39 39
  • ubuntu中安装rpm格式的软件包

    ubuntu的软件包格式是deb xff0c 如果要安装rpm的包 xff0c 则要先用alien把rpm转换成deb zhhLinux联盟 sudo apt get install alien alien默认没有安装 xff0c 所以首先
  • SQLite3在windows下的配置(链接VC++或者VS)

    一 SQLite3 简介 SQLite3 是一个开源免费的嵌入式关系数据库 xff0c 它在 2000 年由 D Richard Hipp 发布 xff0c 它不像大型数据库管理系统 xff0c 占用系统大量资源 SQLite3 是用 C
  • 电脑正常联网,提示无法登录微信

    事故起因 xff1a 因为工作需要安装一款软件 xff0c 安装途中提示有风险直接忽略了该风险 后期卸掉该软件 xff0c 然后无法登录微信 QQ easyconnect等软件 xff0c 但是浏览器可以正常访问 登录微信出现的界面是 xf
  • Ubuntu-GNOME 16.04 LTS更换主题

    1 安装gnome shell扩展插件 进入https extensions gnome org 先将gnome安装插件安装到火狐浏览器上 xff0c 而后查找插件 User Themes by fmuellner 如果无法选择比如题头报错
  • 图片服务器搭建 ftp上传http协议读取图片

    怎样在Win7系统中搭建Web服务器 详见百度搭建教程web服务器搭建 web服务器搭建 搭建好服务器以后配置 controller层 span class hljs javadoc 上传头像 span span class hljs an
  • SVM&TSVM&LSA(I)→PLSA(I)→LDA→HDP

    SVM amp TSVM amp LSA I PLSA I LDA HDP SVM xff08 用于监督学习 xff09 参考文章 xff1a SVM xff08 支持向量机 xff09 详解 通俗来讲 xff0c SVM是一种二类分类模型
  • adb源码分析

    ADB是Android debug bridge的缩写 xff0c 它使用PC机可以通过USB或网络与android设备通讯 adb的源码位于system core adb目录下 xff0c 先来看下编译脚本Android mk xff1a
  • android源码编译笔记--踩坑

    错误 xff1a ninja build stopped subcommand failed 解决 xff1a 打开 prebuilts sdk tools jack admin 找到 JACK SERVER COMMAND 61 34 j
  • 这个交互也太炸裂了趴

    动画是为一个app创造出色用户体验的重要组成部分 它的关键挑战是向用户解释应用程序的逻辑 xff0c 但是常见的错误是鲁莽地使用动画 xff0c 从而否定了改善用户体验的整个观点 为了使应用出色而不仅仅是出色或平庸 xff0c 动画必须正确