Android仿微信朋友圈实现滚动条下拉反弹效果_Android

微信朋友圈上面的图片封面,QQ空间说说上面的图片封面都有下拉反弹的效果,这些都是使用滚动条实现的。下拉,当松开时候,反弹至原来的位置。下拉时候能看到背景图片。那么这里简单介绍一下这种效果的实现。
1、效果图

这部手机显示的分辨率有限,很老的手机调试。
2、具有反弹效果BounceScrollView

package com.org.scroll; 

import android.content.Context;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.TranslateAnimation;
import android.widget.ScrollView; 

/**
 * ScrollView反弹效果的实现
 */
public class BounceScrollView extends ScrollView {
  private View inner;// 孩子View 

  private float y;// 点击时y坐标
  // 矩形(这里只是个形式,只是用于判断是否需要动画.)
  private Rect normal = new Rect(); 

  private boolean isCount = false;// 是否开始计算 

  public BounceScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
  } 

  /***
   * 根据 XML 生成视图工作完成.该函数在生成视图的最后调用,在所有子视图添加完之后. 即使子类覆盖了 onFinishInflate
   * 方法,也应该调用父类的方法,使该方法得以执行.
   */
  @Override
  protected void onFinishInflate() {
    if (getChildCount() > 0) {
      inner = getChildAt(0);
    }
  } 

  /***
   * 监听touch
   */
  @Override
  public boolean onTouchEvent(MotionEvent ev) {
    if (inner != null) {
      commOnTouchEvent(ev);
    } 

    return super.onTouchEvent(ev);
  } 

  /***
   * 触摸事件
   *
   * @param ev
   */
  public void commOnTouchEvent(MotionEvent ev) {
    int action = ev.getAction();
    switch (action) {
    case MotionEvent.ACTION_DOWN:
      break;
    case MotionEvent.ACTION_UP:
      // 手指松开.
      if (isNeedAnimation()) {
        animation();
        isCount = false;
      }
      break;
    /***
     * 排除出第一次移动计算,因为第一次无法得知y坐标, 在MotionEvent.ACTION_DOWN中获取不到,
     * 因为此时是MyScrollView的touch事件传递到到了LIstView的孩子item上面.所以从第二次计算开始.
     * 然而我们也要进行初始化,就是第一次移动的时候让滑动距离归0. 之后记录准确了就正常执行.
     */
    case MotionEvent.ACTION_MOVE:
      final float preY = y;// 按下时的y坐标
      float nowY = ev.getY();// 时时y坐标
      int deltaY = (int) (preY - nowY);// 滑动距离
      if (!isCount) {
        deltaY = 0; // 在这里要归0.
      } 

      y = nowY;
      // 当滚动到最上或者最下时就不会再滚动,这时移动布局
      if (isNeedMove()) {
        // 初始化头部矩形
        if (normal.isEmpty()) {
          // 保存正常的布局位置
          normal.set(inner.getLeft(), inner.getTop(),
              inner.getRight(), inner.getBottom());
        }
//       Log.e("jj", "矩形:" + inner.getLeft() + "," + inner.getTop()
//           + "," + inner.getRight() + "," + inner.getBottom());
        // 移动布局
        inner.layout(inner.getLeft(), inner.getTop() - deltaY / 2,
            inner.getRight(), inner.getBottom() - deltaY / 2);
      }
      isCount = true;
      break; 

    default:
      break;
    }
  } 

  /***
   * 回缩动画
   */
  public void animation() {
    // 开启移动动画
    TranslateAnimation ta = new TranslateAnimation(0, 0, inner.getTop(),
        normal.top);
    ta.setDuration(200);
    inner.startAnimation(ta);
    // 设置回到正常的布局位置
    inner.layout(normal.left, normal.top, normal.right, normal.bottom); 

//   Log.e("jj", "回归:" + normal.left + "," + normal.top + "," + normal.right
//       + "," + normal.bottom); 

    normal.setEmpty(); 

  } 

  // 是否需要开启动画
  public boolean isNeedAnimation() {
    return !normal.isEmpty();
  } 

  /***
   * 是否需要移动布局 inner.getMeasuredHeight():获取的是控件的总高度
   *
   * getHeight():获取的是屏幕的高度
   *
   * @return
   */
  public boolean isNeedMove() {
    int offset = inner.getMeasuredHeight() - getHeight();
    int scrollY = getScrollY();
//   Log.e("jj", "scrolly=" + scrollY);
    // 0是顶部,后面那个是底部
    if (scrollY == 0 || scrollY == offset) {
      return true;
    }
    return false;
  } 

} 

3、MainActivity

package com.org.activity; 

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.Window; 

public class MainActivity extends Activity { 

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_main);
  } 

  @Override
  public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
  } 

}

这个没做什么,主要看布局,以及BounceScrollView类。

4、activity_main布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:tools="http://schemas.android.com/tools"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical" > 

  <include layout="@layout/common_title_bg" /> 

  <com.org.scroll.BounceScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/coversation_bg"
    android:focusable="true"
    android:focusableInTouchMode="true" > 

    <LinearLayout
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"
      android:paddingTop="10.0dip" > 

      <RelativeLayout
        android:id="@+id/accountSetting"
        android:layout_width="fill_parent"
        android:layout_height="63.0dip"
        android:background="#80ffffff"
        android:focusable="true" > 

        <FrameLayout
          android:id="@+id/frameLayout1"
          android:layout_width="54.0dip"
          android:layout_height="54.0dip"
          android:layout_centerVertical="true"
          android:layout_marginLeft="10.0dip" > 

          <ImageView
            android:id="@+id/face"
            android:layout_width="50.0dip"
            android:layout_height="50.0dip"
            android:layout_gravity="center"
            android:contentDescription="@null"
            android:src="@drawable/h0" /> 

          <ImageView
            android:id="@+id/statusIcon"
            android:layout_width="18.0dip"
            android:layout_height="18.0dip"
            android:layout_gravity="bottom|right|center"
            android:contentDescription="@null" />
        </FrameLayout> 

        <ImageView
          android:id="@+id/imageView1"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_alignParentRight="true"
          android:layout_centerVertical="true"
          android:layout_marginRight="10.0dip"
          android:contentDescription="@null"
          android:duplicateParentState="true" /> 

        <TextView
          android:id="@+id/status"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_alignBottom="@+id/nick"
          android:layout_marginRight="10.0dip"
          android:layout_toLeftOf="@id/imageView1"
          android:duplicateParentState="true"
          android:text="在线" /> 

        <TextView
          android:id="@+id/nick"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_centerVertical="true"
          android:layout_marginLeft="10.0dip"
          android:layout_marginRight="69.0dip"
          android:layout_toRightOf="@id/frameLayout1"
          android:duplicateParentState="true"
          android:ellipsize="end"
          android:singleLine="true" />
      </RelativeLayout> 

      <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="600dp"
        android:layout_marginTop="16.0dip"
        android:layout_weight="2.13"
        android:background="#ffffffff"
        android:orientation="vertical" > 

        <TextView
          android:id="@+id/my_profile"
          android:layout_width="fill_parent"
          android:layout_height="44.0dip"
          android:background="#800000ff"
          android:clickable="true"
          android:gravity="center_vertical"
          android:paddingLeft="10.0dip"
          android:paddingRight="10.0dip"
          android:text="标题一" /> 

        <LinearLayout
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:layout_marginTop="16.0dip"
          android:orientation="vertical" > 

          <RelativeLayout
            android:id="@+id/set_feedback"
            android:layout_width="fill_parent"
            android:layout_height="44.0dip"
            android:background="#8000ffff"
            android:clickable="true"
            android:focusable="true" > 

            <TextView
              android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:layout_centerVertical="true"
              android:layout_marginLeft="12.0dip"
              android:duplicateParentState="true"
              android:gravity="center_vertical"
              android:text="反馈" />
          </RelativeLayout>
        </LinearLayout>
      </LinearLayout>
    </LinearLayout>
  </com.org.scroll.BounceScrollView> 

</LinearLayout> 

希望本文对大家学习Android软件编程有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索select 下拉框 滚动条、selenium 滚动条下拉、select下拉列表滚动条、select下拉框加滚动条、网页滚动条不能下拉,以便于您获取更多的相关知识。

时间: 2024-09-15 08:16:06

Android仿微信朋友圈实现滚动条下拉反弹效果_Android的相关文章

Android仿微信朋友圈实现滚动条下拉反弹效果

微信朋友圈上面的图片封面,QQ空间说说上面的图片封面都有下拉反弹的效果,这些都是使用滚动条实现的.下拉,当松开时候,反弹至原来的位置.下拉时候能看到背景图片.那么这里简单介绍一下这种效果的实现. 1.效果图 这部手机显示的分辨率有限,很老的手机调试. 2.具有反弹效果BounceScrollView package com.org.scroll; import android.content.Context; import android.graphics.Rect; import androi

Android 仿微信朋友圈点赞和评论弹出框功能_Android

贡献/下载源码:https://github.com/mmlovesyy/PopupWindowDemo 本文简单模仿微信朋友圈的点赞和评论弹出框,布局等细节请忽略,着重实现弹出框.发评论,及弹出位置的控制. 1. 微信弹出框 微信朋友圈的点赞和评论功能,有2个组成部分: 点击左下角的"更多"按钮,弹出对话框: 点击评论,弹出输入框,添加评论并在页面中实时显示:   微信朋友圈点赞和评论功能 2. 实际效果 本文将建一个 ListView,在其 Item 中简单模仿微信的布局,然后着重

Android仿微信朋友圈全文、收起功能的实例代码

前言 一般在社交APP中都有类似朋友圈的功能,其中发表的动态内容很长的时候不可能让它全部显示.这里就需要做一个仿微信朋友圈全文.收起功能来解决该问题.在网上看到一个例子-->http://www.jb51.net/article/105251.htm ,写的很不错,但是有个bug,他这个Demo只有在条目固定的时候才正常,当增加.删除条目的时候会出现全文.收起显示混乱的问题.原因是他使用了固定的position作为key来保存当前显示的状态.这篇文章在他的基础上进行优化. 效果图 具体代码 (详

Android仿微信朋友圈全文收起功能示例(附源码)

在众多的社交类软件中,朋友圈是必不可少的,可以与好友.同学等分享自己的日常和有意思的事情,在开发社交类App时,朋友圈发表的内容你不可能让他全部显示,全部显示的话用户体验度会非常不好,这时就要用到全文.收缩的功能,朋友如果想要看你发的动态,只要点一下全文就可以查看所有的全部的内容了,如果不想看,也没有必要把这一篇文章全部都滑到底部,才能看下一条内容. 下边将源码贴出来供大家参考:(代码不是最简便的,但是功能是可以的) 首先写一个布局,这个布局是每个子项的布局 item_text_list.xml

Android GridView仿微信朋友圈显示图片_Android

最近项目要求上传多图并且多图显示,而且要规则的显示,就像微信朋友圈的图片显示一样. 利用GridView再适合不过了,GridView可以动态加载图片的数量,而且还比较规律,下面说一下自己的思路: 1.获取网络图片 2.初始化gridview,自定义适配器 3.根据图片数量设置gridview的列数 4.更新适配器 下面贴上部分源码并给大家解析一下一.首先是GridView的item <com.view.SquareLayout xmlns:android="http://schemas.

Android仿微信朋友圈图片查看器_Android

再看文章之前,希望大家先打开自己的微信点到朋友圈中去,仔细观察是不是发现朋友圈里的有个"九宫格"的图片区域,点击图片又会跳到图片的详细查看页面,并且支持图片的滑动和缩放?这个功能是不是很常用呢?!那么我今天正好做了这个Demo,下面为大家讲解一下.首先按照惯例先看一下效果图吧,尤其不会录制gif动画(哎~没办法,模拟器不支持多点触控,刚好我的手机又没有Root,不能录屏,悲催啊,大家见谅,想要看真实效果的话,烦请移到文章最下方转载文章中进行源码下载,点击下载源码,运行后再看效果哈~~)

Android 高仿微信朋友圈动态支持双击手势放大并滑动查看图片效果

最近参与了开发一款旅行APP,其中包含实时聊天和动态评论功能,终于耗时几个月几个伙伴完成了,今天就小结一下至于实时聊天功能如果用户不多的情况可以scoket实现,如果用户万级就可以采用开源的smack + opnefile实现,也可以用mina开源+XMMP,至于怎么搭建和实现,估计目前github上一搜一大把,至于即时通讯怕误人子弟,暂且不做介绍,现就把实现的一个微信朋友圈的小功能介绍一下. 先上效果图: 一拿到主流的UI需求,大致分析下,需要我ListView嵌套Gridview,而grid

Android 高仿微信朋友圈拍照上传功能

模仿微信朋友圈发布动态,输入文字支持文字多少高度自增,有一个最小输入框高度,输入文字有限制,不过这些都很easy! 1. PhotoPicker的使用 这是一个支持选择多张图片,点击图片放大,图片之间左右滑动互相切换的库,同时支持图片删除的库,效果类似微信. (1) 添加PhotoPicker的架包 (2) 使用 选择图片:安卓6.0以后需要在代码中添加读写sd卡和相机的权限 当然清单文件中也需要添加的 PhotoPicker.builder() .setPhotoCount(maxPhoto)

微信朋友圈评论点赞-android 类似微信朋友圈点赞,评论功能怎么实现?

问题描述 android 类似微信朋友圈点赞,评论功能怎么实现? @Override public int getCount() { return 5; } @Override public Object getItem(int position) { return null; } @Override public long getItemId(int position) { return 0; } @Override public int getItemViewType(int positio