ListView 滑动HeadImage的动态缩放
来源:互联网 发布:淘宝预包装及散装食品 编辑:程序博客网 时间:2024/05/17 04:18
源码:http://pan.baidu.com/s/1eRp8UEQ
自定ListView 实现OnScrollListener 接口
package com.example.pullzoomview;import android.app.Activity;import android.content.Context;import android.graphics.Color;import android.os.SystemClock;import android.util.AttributeSet;import android.util.DisplayMetrics;import android.util.Log;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.animation.Interpolator;import android.widget.AbsListView;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.ListView;public class PullToZoomListView extends ListView implements AbsListView.OnScrollListener { private static final int INVALID_VALUE = -1; private static final String TAG = "PullToZoomListView"; private static final Interpolator sInterpolator = new Interpolator() { public float getInterpolation(float paramAnonymousFloat) { float f = paramAnonymousFloat - 1.0F; return 1.0F + f * (f * (f * (f * f))); } }; int mActivePointerId = -1; private FrameLayout mHeaderContainer; private int mHeaderHeight; private ImageView mHeaderImage; float mLastMotionY = -1.0F; float mLastScale = -1.0F; float mMaxScale = -1.0F; private AbsListView.OnScrollListener mOnScrollListener; private ScalingRunnalable mScalingRunnalable; private int mScreenHeight; private ImageView mShadow; private View titleView; public void setTitleView(View titleView) { this.titleView = titleView; } public PullToZoomListView(Context paramContext) { super(paramContext); System.out.println("----1"); init(paramContext); } public PullToZoomListView(Context paramContext, AttributeSet paramAttributeSet) { super(paramContext, paramAttributeSet); System.out.println("----2"); init(paramContext); } public PullToZoomListView(Context paramContext, AttributeSet paramAttributeSet, int paramInt) { super(paramContext, paramAttributeSet, paramInt); System.out.println("----3"); init(paramContext); } private void endScraling() { if (this.mHeaderContainer.getBottom() >= this.mHeaderHeight) Log.d("mmm", "endScraling"); this.mScalingRunnalable.startAnimation(200L); } private void init(Context paramContext) { DisplayMetrics localDisplayMetrics = new DisplayMetrics(); ((Activity) paramContext).getWindowManager().getDefaultDisplay().getMetrics(localDisplayMetrics); this.mScreenHeight = localDisplayMetrics.heightPixels; this.mHeaderContainer = new FrameLayout(paramContext); this.mHeaderImage = new ImageView(paramContext); int i = localDisplayMetrics.widthPixels; setHeaderViewSize(i, (int) (12.0F * (i / 16.0F))); this.mShadow = new ImageView(paramContext); FrameLayout.LayoutParams localLayoutParams = new FrameLayout.LayoutParams(-1, -2); localLayoutParams.gravity = 80; this.mShadow.setLayoutParams(localLayoutParams); this.mHeaderContainer.addView(this.mHeaderImage); this.mHeaderContainer.addView(this.mShadow); addHeaderView(this.mHeaderContainer); this.mScalingRunnalable = new ScalingRunnalable(); super.setOnScrollListener(this); } private void onSecondaryPointerUp(MotionEvent paramMotionEvent) { int i = (paramMotionEvent.getAction()) >> 8; if (paramMotionEvent.getPointerId(i) == this.mActivePointerId) if (i != 0) { int j = 1; this.mLastMotionY = paramMotionEvent.getY(0); this.mActivePointerId = paramMotionEvent.getPointerId(0); return; } } private void reset() { this.mActivePointerId = -1; this.mLastMotionY = -1.0F; this.mMaxScale = -1.0F; this.mLastScale = -1.0F; } public ImageView getHeaderView() { return this.mHeaderImage; } public boolean onInterceptTouchEvent(MotionEvent paramMotionEvent) { return super.onInterceptTouchEvent(paramMotionEvent); } protected void onLayout(boolean paramBoolean, int paramInt1, int paramInt2, int paramInt3, int paramInt4) { super.onLayout(paramBoolean, paramInt1, paramInt2, paramInt3, paramInt4); if (this.mHeaderHeight == 0) this.mHeaderHeight = this.mHeaderContainer.getHeight(); } private Integer titleColor; @Override public void onScroll(AbsListView paramAbsListView, int paramInt1, int paramInt2, int paramInt3) { // Log.d("mmm", "onScroll"); float f = this.mHeaderHeight - this.mHeaderContainer.getBottom(); // Log.d("mmm", "f|" + f); if ((f > 0.0F) && (f < this.mHeaderHeight)) { // Log.d("mmm", "1"); int i = (int) (0.65D * f); this.mHeaderImage.scrollTo(0, -i); } else if (this.mHeaderImage.getScrollY() != 0) { // Log.d("mmm", "2"); this.mHeaderImage.scrollTo(0, 0); } if (this.mOnScrollListener != null) { this.mOnScrollListener.onScroll(paramAbsListView, paramInt1, paramInt2, paramInt3); } View c = paramAbsListView.getChildAt(0); if (c == null) { return; } // assuming all list items have same height int scrolly = -c.getTop() + paramAbsListView.getPaddingTop() + paramAbsListView.getFirstVisiblePosition() * c.getHeight(); // some code if (titleColor == null) { titleColor = getResources().getColor(R.color.title); } int height = c.getHeight() - titleView.getHeight(); if (titleView != null) if (scrolly <= height) { float scale = (float) scrolly / height; float alpha = (255 * scale); // Log.i("TAG","alpha--->"+alpha); // 只是layout背景透明 titleView.setBackgroundColor(Color.argb((int) alpha, Color.red(titleColor), Color.green(titleColor), Color.blue(titleColor))); } } public void onScrollStateChanged(AbsListView paramAbsListView, int paramInt) { if (this.mOnScrollListener != null) this.mOnScrollListener.onScrollStateChanged(paramAbsListView, paramInt); } public boolean onTouchEvent(MotionEvent paramMotionEvent) { Log.d("mmm", "" + (0xFF & paramMotionEvent.getAction())); switch (0xFF & paramMotionEvent.getAction()) { case 4: case 0: if (!this.mScalingRunnalable.mIsFinished) { this.mScalingRunnalable.abortAnimation(); } this.mLastMotionY = paramMotionEvent.getY(); this.mActivePointerId = paramMotionEvent.getPointerId(0); this.mMaxScale = (this.mScreenHeight / this.mHeaderHeight); this.mLastScale = (this.mHeaderContainer.getBottom() / this.mHeaderHeight); break; case 2: Log.d("mmm", "mActivePointerId" + mActivePointerId); int j = paramMotionEvent.findPointerIndex(this.mActivePointerId); if (j == -1) { Log.e("PullToZoomListView", "Invalid pointerId=" + this.mActivePointerId + " in onTouchEvent"); } else { if (this.mLastMotionY == -1.0F) this.mLastMotionY = paramMotionEvent.getY(j); if (this.mHeaderContainer.getBottom() >= this.mHeaderHeight) { ViewGroup.LayoutParams localLayoutParams = this.mHeaderContainer.getLayoutParams(); float f = ((paramMotionEvent.getY(j) - this.mLastMotionY + this.mHeaderContainer.getBottom()) / this.mHeaderHeight - this.mLastScale) / 2.0F + this.mLastScale; if ((this.mLastScale <= 1.0D) && (f < this.mLastScale)) { localLayoutParams.height = this.mHeaderHeight; this.mHeaderContainer.setLayoutParams(localLayoutParams); return super.onTouchEvent(paramMotionEvent); } this.mLastScale = Math.min(Math.max(f, 1.0F), this.mMaxScale); localLayoutParams.height = ((int) (this.mHeaderHeight * this.mLastScale)); if (localLayoutParams.height < this.mScreenHeight) this.mHeaderContainer.setLayoutParams(localLayoutParams); this.mLastMotionY = paramMotionEvent.getY(j); return true; } this.mLastMotionY = paramMotionEvent.getY(j); } break; case 1: reset(); endScraling(); break; case 3: int i = paramMotionEvent.getActionIndex(); this.mLastMotionY = paramMotionEvent.getY(i); this.mActivePointerId = paramMotionEvent.getPointerId(i); break; case 5: onSecondaryPointerUp(paramMotionEvent); this.mLastMotionY = paramMotionEvent.getY(paramMotionEvent.findPointerIndex(this.mActivePointerId)); break; case 6: } return super.onTouchEvent(paramMotionEvent); } public void setHeaderViewSize(int width, int heiht) { Object localObject = this.mHeaderContainer.getLayoutParams(); if (localObject == null) localObject = new AbsListView.LayoutParams(width, heiht); ((ViewGroup.LayoutParams) localObject).width = width; ((ViewGroup.LayoutParams) localObject).height = heiht; this.mHeaderContainer.setLayoutParams((ViewGroup.LayoutParams) localObject); this.mHeaderHeight = heiht; } public void setOnScrollListener(AbsListView.OnScrollListener paramOnScrollListener) { this.mOnScrollListener = paramOnScrollListener; } public void setShadow(int paramInt) { this.mShadow.setBackgroundResource(paramInt); } class ScalingRunnalable implements Runnable { long mDuration; boolean mIsFinished = true; float mScale; long mStartTime; ScalingRunnalable() { } public void abortAnimation() { this.mIsFinished = true; } public boolean isFinished() { return this.mIsFinished; } public void run() { float f2; ViewGroup.LayoutParams localLayoutParams; if ((!this.mIsFinished) && (this.mScale > 1.0D)) { float f1 = ((float) SystemClock.currentThreadTimeMillis() - (float) this.mStartTime) / (float) this.mDuration; f2 = this.mScale - (this.mScale - 1.0F) * PullToZoomListView.sInterpolator.getInterpolation(f1); localLayoutParams = PullToZoomListView.this.mHeaderContainer.getLayoutParams(); if (f2 > 1.0F) { Log.d("mmm", "f2>1.0"); localLayoutParams.height = PullToZoomListView.this.mHeaderHeight; ; localLayoutParams.height = ((int) (f2 * PullToZoomListView.this.mHeaderHeight)); PullToZoomListView.this.mHeaderContainer.setLayoutParams(localLayoutParams); PullToZoomListView.this.post(this); return; } this.mIsFinished = true; } } public void startAnimation(long paramLong) { this.mStartTime = SystemClock.currentThreadTimeMillis(); this.mDuration = paramLong; this.mScale = ((float) (PullToZoomListView.this.mHeaderContainer.getBottom()) / PullToZoomListView.this.mHeaderHeight); this.mIsFinished = false; PullToZoomListView.this.post(this); } }}
headLayout 布局文件 /res/layout/layout_head.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/view_head" android:layout_width="fill_parent" android:layout_height="50dp" android:background="@color/title" > <TextView android:id="@+id/tvHead" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="65dp" android:layout_marginRight="65dp" android:gravity="center" android:singleLine="true" android:text="android" android:textColor="#fff" android:textSize="16sp" /> <ImageView android:id="@+id/ibBack" android:layout_width="40dp" android:layout_height="40dp" android:layout_centerVertical="true" android:clickable="true" android:padding="8dp" android:scaleType="fitXY" /> <TextView android:id="@+id/head_rightTv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:paddingLeft="15dp" android:paddingRight="20dp" android:text="1234" android:textColor="#fff" android:textSize="18sp" android:visibility="gone" /> <ImageView android:id="@+id/head_rightIv" android:layout_width="40dp" android:layout_height="40dp" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:clickable="true" android:padding="10dp" android:scaleType="fitXY" android:visibility="gone" /></RelativeLayout>
主页面布局 /res/layout/main.xml
<RelativeLayout 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:background="#eee" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <com.example.pullzoomview.PullToZoomListView android:id="@+id/listview" android:layout_width="fill_parent" android:layout_height="fill_parent" > </com.example.pullzoomview.PullToZoomListView> <include layout="@layout/layout_head" /></RelativeLayout>
layout_head.xml 布局整体背景颜色 /res/values/colors.xml
<resources xmlns:android="http://schemas.android.com/apk/res/android" > <color name="title">#efefef</color></resources>
0 0
- ListView 滑动HeadImage的动态缩放
- ListView 滑动Headlayout的动态变化
- MFC窗体滑动、缩放、渐变动态效果的实现
- MFC窗体滑动、缩放、渐变动态效果的实现 .
- ANDROID 动态添加的listView,仿QQ滑动删除
- listview 顶部添加tabhost,list滑动时tabhost可以悬浮、缩放的效果
- ListView的滑动加载
- ListView的滑动删除
- 横向滑动的 ListView
- listview的滑动删除
- 横向滑动的listview
- 上下滑动的Listview
- listview的滑动删除
- ListView的滑动冲突
- ListView的滑动删除
- ListView的水平滑动
- ListView的滑动监听
- 横向滑动的ListView
- 使用tcpdump在android设备上抓包
- Gradle依赖的统一管理
- 图灵机器人——人工智能聊天服务
- appium环境搭建步骤记录(三)-appium-client安装
- hdu 5642 King's Order 递推
- ListView 滑动HeadImage的动态缩放
- extjs 中绑定事件是.on('事件',function(){}),那如果是想移除已绑定的事件该怎么写啊?
- 癌症病人症状消失
- pku3317 Stake Your Claim 极大极小搜索+状压+AB剪枝
- Caffe&C++使用教程
- UITableView-表格视图
- 该如何区分不同版本的ABBYY FineReader
- altium designer10创建项目
- [Offer收割]编程练习赛2 hihocoder 1272 买零食 (DFS 或 dp 水题)