本帖最后由 ☂上官๑۩۞۩ 于 2015-7-15 17:14 编辑
复制代码
文章来自:达达的梦想的博客 http://blog.csdn.net/zhaiyuanjun
微信从6.0版本开始推出小视频功能,随着4G网络的出现,视频将会是一个趋势,他能表达出文字所不能表现的东西,增加了微信的黏性。还记得微信小视频这个功能一推出,如同病毒一样席卷朋友圈。
作为爱美的我们,怎么能把我们的窘态暴露给朋友圈的小伙伴呢,必须正能量!美好的!必须美化! So,录制小视频后,加各种滤镜,炫酷MV主题,妈妈再也不担心我的猪窝了…
“小视频”对于微信如此之重要。那么,如何实现呢?
先看下咱们的实现效果:
PS:gif 图片比较大,如果等不及的童鞋,可以点击这里查看视频
OK,先看下,消息列表页面的 下滑显示眼睛动画效果的实现方式:
自定义ListView:PullDownListView.java
PullDownListView来自guojunyi的分享, GitHub项目地址:点击这里
-
package com.example.wechat01.widght;
-
-
import android.content.Context;
-
import android.graphics.Color;
-
import android.util.AttributeSet;
-
import android.util.Log;
-
import android.view.MotionEvent;
-
import android.view.View;
-
import android.widget.AbsListView;
-
import android.widget.AbsListView.OnScrollListener;
-
import android.widget.ListView;
-
import android.widget.RelativeLayout;
-
-
import com.example.wechat01.R;
-
import com.nineoldandroids.animation.ValueAnimator;
-
import com.nineoldandroids.animation.ValueAnimator.AnimatorUpdateListener;
-
-
public class PullDownListView extends RelativeLayout implements
-
OnScrollListener {
-
static int MAX_PULL_TOP_HEIGHT;
-
static int MAX_PULL_BOTTOM_HEIGHT;
-
-
static int REFRESHING_TOP_HEIGHT;
-
static int REFRESHING_BOTTOM_HEIGHT;
-
-
private boolean isTop;
-
private boolean isBottom;
-
private boolean isRefreshing;
-
private boolean isAnimation;
-
-
RelativeLayout layoutHeader;
-
RelativeLayout layoutFooter;
-
-
private int mCurrentY = 0;
-
boolean pullTag = false;
-
OnScrollListener mOnScrollListener;
-
OnPullHeightChangeListener mOnPullHeightChangeListener;
-
-
public void setOnPullHeightChangeListener(
-
OnPullHeightChangeListener listener) {
-
this.mOnPullHeightChangeListener = listener;
-
}
-
-
public void setOnScrollListener(OnScrollListener listener) {
-
mOnScrollListener = listener;
-
}
-
-
public PullDownListView(Context context, AttributeSet attrs) {
-
super(context, attrs);
-
// TODO Auto-generated constructor stub
-
}
-
-
public boolean isRefreshing() {
-
return this.isRefreshing;
-
}
-
-
private ListView mListView = new ListView(getContext()) {
-
-
int lastY = 0;
-
-
@Override
-
public boolean onTouchEvent(MotionEvent ev) {
-
if (isAnimation || isRefreshing) {
-
return super.onTouchEvent(ev);
-
}
-
RelativeLayout parent = (RelativeLayout) mListView.getParent();
-
-
int currentY = (int) ev.getRawY();
-
switch (ev.getAction()) {
-
case MotionEvent.ACTION_DOWN:
-
lastY = (int) ev.getRawY();
-
break;
-
case MotionEvent.ACTION_MOVE: {
-
boolean isToBottom = currentY - lastY >= 0 ? true : false;
-
-
int step = Math.abs(currentY - lastY);
-
lastY = currentY;
-
-
if (isTop && mListView.getTop() >= 0) {
-
-
if (isToBottom && mListView.getTop() <= MAX_PULL_TOP_HEIGHT) {
-
MotionEvent event = MotionEvent.obtain(ev);
-
ev.setAction(MotionEvent.ACTION_UP);
-
super.onTouchEvent(ev);
-
pullTag = true;
-
-
if (mListView.getTop() > layoutHeader.getHeight()) {
-
step = step / 2;
-
}
-
if ((mListView.getTop() + step) > MAX_PULL_TOP_HEIGHT) {
-
mCurrentY = MAX_PULL_TOP_HEIGHT;
-
scrollTopTo(mCurrentY);
-
} else {
-
mCurrentY += step;
-
scrollTopTo(mCurrentY);
-
}
-
} else if (!isToBottom && mListView.getTop() > 0) {
-
MotionEvent event = MotionEvent.obtain(ev);
-
ev.setAction(MotionEvent.ACTION_UP);
-
super.onTouchEvent(ev);
-
if ((mListView.getTop() - step) < 0) {
-
mCurrentY = 0;
-
scrollTopTo(mCurrentY);
-
} else {
-
mCurrentY -= step;
-
scrollTopTo(mCurrentY);
-
}
-
} else if (!isToBottom && mListView.getTop() == 0) {
-
if (!pullTag) {
-
return super.onTouchEvent(ev);
-
}
-
-
}
-
-
return true;
-
} else if (isBottom
-
&& mListView.getBottom() <= parent.getHeight()) {
-
if (!isToBottom
-
&& (parent.getHeight() - mListView.getBottom()) <= MAX_PULL_BOTTOM_HEIGHT) {
-
MotionEvent event = MotionEvent.obtain(ev);
-
ev.setAction(MotionEvent.ACTION_UP);
-
super.onTouchEvent(ev);
-
pullTag = true;
-
if (parent.getHeight() - mListView.getBottom() > layoutFooter
-
.getHeight()) {
-
step = step / 2;
-
}
-
-
if ((mListView.getBottom() - step) < (parent
-
.getHeight() - MAX_PULL_BOTTOM_HEIGHT)) {
-
mCurrentY = -MAX_PULL_BOTTOM_HEIGHT;
-
scrollBottomTo(mCurrentY);
-
} else {
-
mCurrentY -= step;
-
scrollBottomTo(mCurrentY);
-
}
-
} else if (isToBottom
-
&& (mListView.getBottom() < parent.getHeight())) {
-
if ((mListView.getBottom() + step) > parent.getHeight()) {
-
mCurrentY = 0;
-
scrollBottomTo(mCurrentY);
-
} else {
-
mCurrentY += step;
-
scrollBottomTo(mCurrentY);
-
}
-
} else if (isToBottom
-
&& mListView.getBottom() == parent.getHeight()) {
-
if (!pullTag) {
-
return super.onTouchEvent(ev);
-
}
-
}
-
return true;
-
}
-
break;
-
}
-
case MotionEvent.ACTION_CANCEL:
-
case MotionEvent.ACTION_UP:
-
pullTag = false;
-
-
if (mListView.getTop() > 0) {
-
if (mListView.getTop() > REFRESHING_TOP_HEIGHT) {
-
animateTopTo(layoutHeader.getMeasuredHeight());
-
isRefreshing = true;
-
if (null != mOnPullHeightChangeListener) {
-
mOnPullHeightChangeListener.onRefreshing(true);
-
}
-
} else {
-
animateTopTo(0);
-
}
-
-
} else if (mListView.getBottom() < parent.getHeight()) {
-
if ((parent.getHeight() - mListView.getBottom()) > REFRESHING_BOTTOM_HEIGHT) {
-
animateBottomTo(-layoutFooter.getMeasuredHeight());
-
isRefreshing = true;
-
if (null != mOnPullHeightChangeListener) {
-
mOnPullHeightChangeListener.onRefreshing(false);
-
}
-
} else {
-
animateBottomTo(0);
-
}
-
}
-
-
}
-
-
return super.onTouchEvent(ev);
-
}
-
-
};
-
-
public void scrollBottomTo(int y) {
-
mListView.layout(mListView.getLeft(), y, mListView.getRight(),
-
this.getMeasuredHeight() + y);
-
if (null != mOnPullHeightChangeListener) {
-
mOnPullHeightChangeListener.onBottomHeightChange(
-
layoutHeader.getHeight(), -y);
-
}
-
}
-
-
public void animateBottomTo(final int y) {
-
ValueAnimator animator = ValueAnimator.ofInt(mListView.getBottom()
-
- this.getMeasuredHeight(), y);
-
animator.setDuration(300);
-
animator.addUpdateListener(new AnimatorUpdateListener() {
-
@Override
-
public void onAnimationUpdate(ValueAnimator animation) {
-
// TODO Auto-generated method stub
-
int frameValue = (Integer) animation.getAnimatedValue();
-
mCurrentY = frameValue;
-
scrollBottomTo(frameValue);
-
if (frameValue == y) {
-
isAnimation = false;
-
}
-
}
-
});
-
isAnimation = true;
-
animator.start();
-
}
-
-
public void scrollTopTo(int y) {
-
mListView.layout(mListView.getLeft(), y, mListView.getRight(),
-
this.getMeasuredHeight() + y);
-
if (null != mOnPullHeightChangeListener) {
-
mOnPullHeightChangeListener.onTopHeightChange(
-
layoutHeader.getHeight(), y);
-
}
-
}
-
-
public void animateTopTo(final int y) {
-
ValueAnimator animator = ValueAnimator.ofInt(mListView.getTop(), y);
-
animator.setDuration(300);
-
animator.addUpdateListener(new AnimatorUpdateListener() {
-
@Override
-
public void onAnimationUpdate(ValueAnimator animation) {
-
// TODO Auto-generated method stub
-
int frameValue = (Integer) animation.getAnimatedValue();
-
mCurrentY = frameValue;
-
scrollTopTo(frameValue);
-
if (frameValue == y) {
-
isAnimation = false;
-
}
-
}
-
});
-
isAnimation = true;
-
animator.start();
-
}
-
-
@Override
-
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
-
REFRESHING_TOP_HEIGHT = layoutHeader.getMeasuredHeight();
-
REFRESHING_BOTTOM_HEIGHT = layoutFooter.getMeasuredHeight();
-
-
MAX_PULL_TOP_HEIGHT = this.getMeasuredHeight();
-
MAX_PULL_BOTTOM_HEIGHT = this.getMeasuredHeight();
-
}
-
-
@Override
-
public void onFinishInflate() {
-
-
mListView.setBackgroundColor(0xffffffff);
-
mListView.setCacheColorHint(Color.TRANSPARENT);
-
mListView.setVerticalScrollBarEnabled(false);
-
mListView.setLayoutParams(new RelativeLayout.LayoutParams(
-
LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
-
mListView.setOnScrollListener(this);
-
mListView.setDividerHeight(0);
-
this.addView(mListView);
-
-
layoutHeader = (RelativeLayout) this.findViewById(R.id.layoutHeader);
-
layoutFooter = (RelativeLayout) this.findViewById(R.id.layoutFooter);
-
-
super.onFinishInflate();
-
}
-
-
public ListView getListView() {
-
return this.mListView;
-
}
-
-
public void pullUp() {
-
isRefreshing = false;
-
if (mListView.getTop() > 0) {
-
animateTopTo(0);
-
} else if (mListView.getBottom() < this.getHeight()) {
-
animateBottomTo(0);
-
}
-
-
}
-
-
@Override
-
public void onScroll(AbsListView view, int firstVisibleItem,
-
int visibleItemCount, int totalItemCount) {
-
// TODO Auto-generated method stub
-
if (null != mOnScrollListener) {
-
mOnScrollListener.onScroll(view, firstVisibleItem,
-
visibleItemCount, totalItemCount);
-
}
-
if (mListView.getCount() > 0) {
-
if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
-
View lastItem = (View) mListView
-
.getChildAt(visibleItemCount - 1);
-
if (null != lastItem) {
-
-
if (lastItem.getBottom() == mListView.getHeight()) {
-
Log.e("my", lastItem.getBottom() + "");
-
isBottom = true;
-
} else {
-
isBottom = false;
-
}
-
}
-
} else {
-
isBottom = false;
-
}
-
} else {
-
isBottom = false;
-
}
-
-
if (mListView.getCount() > 0) {
-
if (firstVisibleItem == 0) {
-
View firstItem = mListView.getChildAt(0);
-
if (null != firstItem) {
-
if (firstItem.getTop() == 0) {
-
isTop = true;
-
} else {
-
isTop = false;
-
}
-
}
-
} else {
-
isTop = false;
-
}
-
} else {
-
isTop = true;
-
}
-
-
}
-
-
@Override
-
public void onScrollStateChanged(AbsListView view, int scrollState) {
-
// TODO Auto-generated method stub
-
if (null != mOnScrollListener) {
-
mOnScrollListener.onScrollStateChanged(view, scrollState);
-
}
-
}
-
-
// listener call back
-
public interface OnPullHeightChangeListener {
-
public void onTopHeightChange(int headerHeight, int pullHeight);
-
-
public void onBottomHeightChange(int footerHeight, int pullHeight);
-
-
public void onRefreshing(boolean isTop);
-
}
-
}
这个Demo比较复杂,具体实现方式请大家去Github研究一下代码吧~
另外还有视频录制这块的功能,有些复杂,这块是用的秒拍团队提供的视频录制SDK,感兴趣的可以去官网膜拜~
官网地址: ![]()
OK,项目的完整代码可以去 Github (点击这里) 下载。
Github项目地址:https://github.com/motianhuo/VCameraDemo
文章来自:达达的梦想的博客 http://blog.csdn.net/zhaiyuanjun
本文介绍微信6.0版本引入的小视频功能,并提供了一个复杂的自定义ListView实现案例,包括下滑显示眼睛动画效果的具体代码实现。

345

被折叠的 条评论
为什么被折叠?



