【高仿微信系列】微信录制小视频

2023-11-05 13:08

本文主要是介绍【高仿微信系列】微信录制小视频,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本帖最后由 ☂上官๑۩۞۩ 于 2015-7-15 17:14 编辑

微信从6.0版本开始推出小视频功能,随着4G网络的出现,视频将会是一个趋势,他能表达出文字所不能表现的东西,增加了微信的黏性。还记得微信小视频这个功能一推出,如同病毒一样席卷朋友圈。

作为爱美的我们,怎么能把我们的窘态暴露给朋友圈的小伙伴呢,必须正能量!美好的!必须美化! So,录制小视频后,加各种滤镜,炫酷MV主题,妈妈再也不担心我的猪窝了…

“小视频”对于微信如此之重要。那么,如何实现呢? 
先看下咱们的实现效果:

            


PS:gif 图片比较大,如果等不及的童鞋,可以点击这里查看视频

OK,先看下,消息列表页面的 下滑显示眼睛动画效果的实现方式: 
自定义ListView:PullDownListView.java 
PullDownListView来自guojunyi的分享, GitHub项目地址:点击这里

  1. package com.example.wechat01.widght;

  2. import android.content.Context;
  3. import android.graphics.Color;
  4. import android.util.AttributeSet;
  5. import android.util.Log;
  6. import android.view.MotionEvent;
  7. import android.view.View;
  8. import android.widget.AbsListView;
  9. import android.widget.AbsListView.OnScrollListener;
  10. import android.widget.ListView;
  11. import android.widget.RelativeLayout;

  12. import com.example.wechat01.R;
  13. import com.nineoldandroids.animation.ValueAnimator;
  14. import com.nineoldandroids.animation.ValueAnimator.AnimatorUpdateListener;

  15. public class PullDownListView extends RelativeLayout implements
  16.                 OnScrollListener {
  17.         static int MAX_PULL_TOP_HEIGHT;
  18.         static int MAX_PULL_BOTTOM_HEIGHT;

  19.         static int REFRESHING_TOP_HEIGHT;
  20.         static int REFRESHING_BOTTOM_HEIGHT;

  21.         private boolean isTop;
  22.         private boolean isBottom;
  23.         private boolean isRefreshing;
  24.         private boolean isAnimation;

  25.         RelativeLayout layoutHeader;
  26.         RelativeLayout layoutFooter;

  27.         private int mCurrentY = 0;
  28.         boolean pullTag = false;
  29.         OnScrollListener mOnScrollListener;
  30.         OnPullHeightChangeListener mOnPullHeightChangeListener;

  31.         public void setOnPullHeightChangeListener(
  32.                         OnPullHeightChangeListener listener) {
  33.                 this.mOnPullHeightChangeListener = listener;
  34.         }

  35.         public void setOnScrollListener(OnScrollListener listener) {
  36.                 mOnScrollListener = listener;
  37.         }

  38.         public PullDownListView(Context context, AttributeSet attrs) {
  39.                 super(context, attrs);
  40.                 // TODO Auto-generated constructor stub
  41.         }

  42.         public boolean isRefreshing() {
  43.                 return this.isRefreshing;
  44.         }

  45.         private ListView mListView = new ListView(getContext()) {

  46.                 int lastY = 0;

  47.                 @Override
  48.                 public boolean onTouchEvent(MotionEvent ev) {
  49.                         if (isAnimation || isRefreshing) {
  50.                                 return super.onTouchEvent(ev);
  51.                         }
  52.                         RelativeLayout parent = (RelativeLayout) mListView.getParent();

  53.                         int currentY = (int) ev.getRawY();
  54.                         switch (ev.getAction()) {
  55.                         case MotionEvent.ACTION_DOWN:
  56.                                 lastY = (int) ev.getRawY();
  57.                                 break;
  58.                         case MotionEvent.ACTION_MOVE: {
  59.                                 boolean isToBottom = currentY - lastY >= 0 ? true : false;

  60.                                 int step = Math.abs(currentY - lastY);
  61.                                 lastY = currentY;

  62.                                 if (isTop && mListView.getTop() >= 0) {

  63.                                         if (isToBottom && mListView.getTop() <= MAX_PULL_TOP_HEIGHT) {
  64.                                                 MotionEvent event = MotionEvent.obtain(ev);
  65.                                                 ev.setAction(MotionEvent.ACTION_UP);
  66.                                                 super.onTouchEvent(ev);
  67.                                                 pullTag = true;

  68.                                                 if (mListView.getTop() > layoutHeader.getHeight()) {
  69.                                                         step = step / 2;
  70.                                                 }
  71.                                                 if ((mListView.getTop() + step) > MAX_PULL_TOP_HEIGHT) {
  72.                                                         mCurrentY = MAX_PULL_TOP_HEIGHT;
  73.                                                         scrollTopTo(mCurrentY);
  74.                                                 } else {
  75.                                                         mCurrentY += step;
  76.                                                         scrollTopTo(mCurrentY);
  77.                                                 }
  78.                                         } else if (!isToBottom && mListView.getTop() > 0) {
  79.                                                 MotionEvent event = MotionEvent.obtain(ev);
  80.                                                 ev.setAction(MotionEvent.ACTION_UP);
  81.                                                 super.onTouchEvent(ev);
  82.                                                 if ((mListView.getTop() - step) < 0) {
  83.                                                         mCurrentY = 0;
  84.                                                         scrollTopTo(mCurrentY);
  85.                                                 } else {
  86.                                                         mCurrentY -= step;
  87.                                                         scrollTopTo(mCurrentY);
  88.                                                 }
  89.                                         } else if (!isToBottom && mListView.getTop() == 0) {
  90.                                                 if (!pullTag) {
  91.                                                         return super.onTouchEvent(ev);
  92.                                                 }

  93.                                         }

  94.                                         return true;
  95.                                 } else if (isBottom
  96.                                                 && mListView.getBottom() <= parent.getHeight()) {
  97.                                         if (!isToBottom
  98.                                                         && (parent.getHeight() - mListView.getBottom()) <= MAX_PULL_BOTTOM_HEIGHT) {
  99.                                                 MotionEvent event = MotionEvent.obtain(ev);
  100.                                                 ev.setAction(MotionEvent.ACTION_UP);
  101.                                                 super.onTouchEvent(ev);
  102.                                                 pullTag = true;
  103.                                                 if (parent.getHeight() - mListView.getBottom() > layoutFooter
  104.                                                                 .getHeight()) {
  105.                                                         step = step / 2;
  106.                                                 }

  107.                                                 if ((mListView.getBottom() - step) < (parent
  108.                                                                 .getHeight() - MAX_PULL_BOTTOM_HEIGHT)) {
  109.                                                         mCurrentY = -MAX_PULL_BOTTOM_HEIGHT;
  110.                                                         scrollBottomTo(mCurrentY);
  111.                                                 } else {
  112.                                                         mCurrentY -= step;
  113.                                                         scrollBottomTo(mCurrentY);
  114.                                                 }
  115.                                         } else if (isToBottom
  116.                                                         && (mListView.getBottom() < parent.getHeight())) {
  117.                                                 if ((mListView.getBottom() + step) > parent.getHeight()) {
  118.                                                         mCurrentY = 0;
  119.                                                         scrollBottomTo(mCurrentY);
  120.                                                 } else {
  121.                                                         mCurrentY += step;
  122.                                                         scrollBottomTo(mCurrentY);
  123.                                                 }
  124.                                         } else if (isToBottom
  125.                                                         && mListView.getBottom() == parent.getHeight()) {
  126.                                                 if (!pullTag) {
  127.                                                         return super.onTouchEvent(ev);
  128.                                                 }
  129.                                         }
  130.                                         return true;
  131.                                 }
  132.                                 break;
  133.                         }
  134.                         case MotionEvent.ACTION_CANCEL:
  135.                         case MotionEvent.ACTION_UP:
  136.                                 pullTag = false;

  137.                                 if (mListView.getTop() > 0) {
  138.                                         if (mListView.getTop() > REFRESHING_TOP_HEIGHT) {
  139.                                                 animateTopTo(layoutHeader.getMeasuredHeight());
  140.                                                 isRefreshing = true;
  141.                                                 if (null != mOnPullHeightChangeListener) {
  142.                                                         mOnPullHeightChangeListener.onRefreshing(true);
  143.                                                 }
  144.                                         } else {
  145.                                                 animateTopTo(0);
  146.                                         }

  147.                                 } else if (mListView.getBottom() < parent.getHeight()) {
  148.                                         if ((parent.getHeight() - mListView.getBottom()) > REFRESHING_BOTTOM_HEIGHT) {
  149.                                                 animateBottomTo(-layoutFooter.getMeasuredHeight());
  150.                                                 isRefreshing = true;
  151.                                                 if (null != mOnPullHeightChangeListener) {
  152.                                                         mOnPullHeightChangeListener.onRefreshing(false);
  153.                                                 }
  154.                                         } else {
  155.                                                 animateBottomTo(0);
  156.                                         }
  157.                                 }

  158.                         }

  159.                         return super.onTouchEvent(ev);
  160.                 }

  161.         };

  162.         public void scrollBottomTo(int y) {
  163.                 mListView.layout(mListView.getLeft(), y, mListView.getRight(),
  164.                                 this.getMeasuredHeight() + y);
  165.                 if (null != mOnPullHeightChangeListener) {
  166.                         mOnPullHeightChangeListener.onBottomHeightChange(
  167.                                         layoutHeader.getHeight(), -y);
  168.                 }
  169.         }

  170.         public void animateBottomTo(final int y) {
  171.                 ValueAnimator animator = ValueAnimator.ofInt(mListView.getBottom()
  172.                                 - this.getMeasuredHeight(), y);
  173.                 animator.setDuration(300);
  174.                 animator.addUpdateListener(new AnimatorUpdateListener() {
  175.                         @Override
  176.                         public void onAnimationUpdate(ValueAnimator animation) {
  177.                                 // TODO Auto-generated method stub
  178.                                 int frameValue = (Integer) animation.getAnimatedValue();
  179.                                 mCurrentY = frameValue;
  180.                                 scrollBottomTo(frameValue);
  181.                                 if (frameValue == y) {
  182.                                         isAnimation = false;
  183.                                 }
  184.                         }
  185.                 });
  186.                 isAnimation = true;
  187.                 animator.start();
  188.         }

  189.         public void scrollTopTo(int y) {
  190.                 mListView.layout(mListView.getLeft(), y, mListView.getRight(),
  191.                                 this.getMeasuredHeight() + y);
  192.                 if (null != mOnPullHeightChangeListener) {
  193.                         mOnPullHeightChangeListener.onTopHeightChange(
  194.                                         layoutHeader.getHeight(), y);
  195.                 }
  196.         }

  197.         public void animateTopTo(final int y) {
  198.                 ValueAnimator animator = ValueAnimator.ofInt(mListView.getTop(), y);
  199.                 animator.setDuration(300);
  200.                 animator.addUpdateListener(new AnimatorUpdateListener() {
  201.                         @Override
  202.                         public void onAnimationUpdate(ValueAnimator animation) {
  203.                                 // TODO Auto-generated method stub
  204.                                 int frameValue = (Integer) animation.getAnimatedValue();
  205.                                 mCurrentY = frameValue;
  206.                                 scrollTopTo(frameValue);
  207.                                 if (frameValue == y) {
  208.                                         isAnimation = false;
  209.                                 }
  210.                         }
  211.                 });
  212.                 isAnimation = true;
  213.                 animator.start();
  214.         }

  215.         @Override
  216.         public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  217.                 super.onMeasure(widthMeasureSpec, heightMeasureSpec);

  218.                 REFRESHING_TOP_HEIGHT = layoutHeader.getMeasuredHeight();
  219.                 REFRESHING_BOTTOM_HEIGHT = layoutFooter.getMeasuredHeight();

  220.                 MAX_PULL_TOP_HEIGHT = this.getMeasuredHeight();
  221.                 MAX_PULL_BOTTOM_HEIGHT = this.getMeasuredHeight();
  222.         }

  223.         @Override
  224.         public void onFinishInflate() {

  225.                 mListView.setBackgroundColor(0xffffffff);
  226.                 mListView.setCacheColorHint(Color.TRANSPARENT);
  227.                 mListView.setVerticalScrollBarEnabled(false);
  228.                 mListView.setLayoutParams(new RelativeLayout.LayoutParams(
  229.                                 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
  230.                 mListView.setOnScrollListener(this);
  231.                 mListView.setDividerHeight(0);
  232.                 this.addView(mListView);

  233.                 layoutHeader = (RelativeLayout) this.findViewById(R.id.layoutHeader);
  234.                 layoutFooter = (RelativeLayout) this.findViewById(R.id.layoutFooter);

  235.                 super.onFinishInflate();
  236.         }

  237.         public ListView getListView() {
  238.                 return this.mListView;
  239.         }

  240.         public void pullUp() {
  241.                 isRefreshing = false;
  242.                 if (mListView.getTop() > 0) {
  243.                         animateTopTo(0);
  244.                 } else if (mListView.getBottom() < this.getHeight()) {
  245.                         animateBottomTo(0);
  246.                 }

  247.         }

  248.         @Override
  249.         public void onScroll(AbsListView view, int firstVisibleItem,
  250.                         int visibleItemCount, int totalItemCount) {
  251.                 // TODO Auto-generated method stub
  252.                 if (null != mOnScrollListener) {
  253.                         mOnScrollListener.onScroll(view, firstVisibleItem,
  254.                                         visibleItemCount, totalItemCount);
  255.                 }
  256.                 if (mListView.getCount() > 0) {
  257.                         if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
  258.                                 View lastItem = (View) mListView
  259.                                                 .getChildAt(visibleItemCount - 1);
  260.                                 if (null != lastItem) {

  261.                                         if (lastItem.getBottom() == mListView.getHeight()) {
  262.                                                 Log.e("my", lastItem.getBottom() + "");
  263.                                                 isBottom = true;
  264.                                         } else {
  265.                                                 isBottom = false;
  266.                                         }
  267.                                 }
  268.                         } else {
  269.                                 isBottom = false;
  270.                         }
  271.                 } else {
  272.                         isBottom = false;
  273.                 }

  274.                 if (mListView.getCount() > 0) {
  275.                         if (firstVisibleItem == 0) {
  276.                                 View firstItem = mListView.getChildAt(0);
  277.                                 if (null != firstItem) {
  278.                                         if (firstItem.getTop() == 0) {
  279.                                                 isTop = true;
  280.                                         } else {
  281.                                                 isTop = false;
  282.                                         }
  283.                                 }
  284.                         } else {
  285.                                 isTop = false;
  286.                         }
  287.                 } else {
  288.                         isTop = true;
  289.                 }

  290.         }

  291.         @Override
  292.         public void onScrollStateChanged(AbsListView view, int scrollState) {
  293.                 // TODO Auto-generated method stub
  294.                 if (null != mOnScrollListener) {
  295.                         mOnScrollListener.onScrollStateChanged(view, scrollState);
  296.                 }
  297.         }

  298.         // listener call back
  299.         public interface OnPullHeightChangeListener {
  300.                 public void onTopHeightChange(int headerHeight, int pullHeight);

  301.                 public void onBottomHeightChange(int footerHeight, int pullHeight);

  302.                 public void onRefreshing(boolean isTop);
  303.         }
  304. }
复制代码

这个Demo比较复杂,具体实现方式请大家去Github研究一下代码吧~ 
另外还有视频录制这块的功能,有些复杂,这块是用的秒拍团队提供的视频录制SDK,感兴趣的可以去官网膜拜~


官网地址: 

OK,项目的完整代码可以去 Github (点击这里) 下载。


Download Apk


Github项目地址:https://github.com/motianhuo/VCameraDemo

文章来自:达达的梦想的博客   http://blog.csdn.net/zhaiyuanjun

这篇关于【高仿微信系列】微信录制小视频的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/350068

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

GPT系列之:GPT-1,GPT-2,GPT-3详细解读

一、GPT1 论文:Improving Language Understanding by Generative Pre-Training 链接:https://cdn.openai.com/research-covers/languageunsupervised/language_understanding_paper.pdf 启发点:生成loss和微调loss同时作用,让下游任务来适应预训

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

轻松录制每一刻:探索2024年免费高清录屏应用

你不会还在用一些社交工具来录屏吧?现在的市面上有不少免费录屏的软件了。别看如软件是免费的,它的功能比起社交工具的录屏功能来说全面的多。这次我就分享几款我用过的录屏工具。 1.福晰录屏大师 链接直达:https://www.foxitsoftware.cn/REC/  这个软件的操作方式非常简单,打开软件之后从界面设计就能看出来这个软件操作的便捷性。界面的设计简单明了基本一打眼你就会轻松驾驭啦

Java基础回顾系列-第七天-高级编程之IO

Java基础回顾系列-第七天-高级编程之IO 文件操作字节流与字符流OutputStream字节输出流FileOutputStream InputStream字节输入流FileInputStream Writer字符输出流FileWriter Reader字符输入流字节流与字符流的区别转换流InputStreamReaderOutputStreamWriter 文件复制 字符编码内存操作流(

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma