android中随着ScrollView的滑动,titleBar状态的改变

今天项目有一个需求,,类是于QQ空间里面的一个功能,于是就研究了一下,嗯,说这么多,可能还有人不知道指的是那个,直接上效果图。见谅,不会弄动态图:

对,就是这种效果,我研究了一下,思路如下:

1.监听ScrollView的滑动

2.通过判断滑动的距离,然后给titleBar设置相应的颜色渐变

但是后来我发现我找不到ScrollView的监听器,也就是说,ScrollView没有对外提供相应的监听接口,不提供就算了嘛,我我自己提供于是就出现了下面这段代码:

package com.example.myscrollview;

import android.content.Context;

import android.util.AttributeSet;

import android.view.View;

import android.widget.ScrollView;

public class MyScrollView extends ScrollView {

private ScrollViewListener scrollViewListener = null;

public MyScrollView(Context context) {

super(context);

}

public MyScrollView(Context context, AttributeSet attrs) {

super(context, attrs);

}

@Override

protected void onScrollChanged(int x, int y, int oldx, int oldy) {

// x为当前滑动条的横坐标,y表示当前滑动条的纵坐标,oldx为前一次滑动的横坐标,oldy表示前一次滑动的纵坐标

super.onScrollChanged(x, y, oldx, oldy);

if (scrollViewListener != null) {

// 在这里将方法暴露出去

scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);

}

}

// 是否要其弹性滑动

@Override

protected boolean overScrollBy(int deltaX, int deltaY, int scrollX,

int scrollY, int scrollRangeX, int scrollRangeY,

int maxOverScrollX, int maxOverScrollY, boolean isTouchEvent) {

// 弹性滑动关键则是maxOverScrollX, 以及maxOverScrollY,

// 一般默认值都是0,需要弹性时,更改其值即可

// 即就是,为零则不会发生弹性,不为零(>0,负数未测试)则会滑动到其值的位置

return super.overScrollBy(deltaX, deltaY, scrollX, scrollY,

scrollRangeX, scrollRangeY, 0, 0, isTouchEvent);

}

// 接口

public interface ScrollViewListener {

void onScrollChanged(View scrollView, int x, int y, int oldx, int oldy);

}

public void setScrollViewListener(ScrollViewListener listener) {

scrollViewListener = listener;

}

}

自定义完成之后,就可以在MainActivity中进行获取了:

package com.example.myscrollview;

import android.app.Activity;

import android.os.Bundle;

import android.view.View;

import android.widget.RelativeLayout;

import com.example.myscrollview.MyScrollView.ScrollViewListener;

public class MainActivity extends Activity {

MyScrollView scroll;

RelativeLayout title;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

scroll = (MyScrollView) findViewById(R.id.scroll);

title = (RelativeLayout) findViewById(R.id.title);

// 实现自定义控件中的监听器

scroll.setScrollViewListener(new ScrollViewListener() {

@Override

public void onScrollChanged(View scrollView, int x, int y,

int oldx, int oldy) {

// TODO Auto-generated method stub

titleAnima(y);

}

});

}

/**

* 出现渐变效果

*/

public void titleAnima(int y) {

int scrollHeight = scroll.getChildAt(0).getHeight()

- scroll.getHeight();

float scrollPercent = (float) y / scrollHeight;

title.getBackground().setAlpha((int) (255 * scrollPercent));

// 如果有文字的话,还可以设置文字的颜色渐变

// int color = topText.getTextColors().getDefaultColor();

// int r = Color.red(color);

// int g = Color.green(color);

// int b = Color.blue(color);

// int changeToColor = Color.argb((int) (255 * (1 - scrollPercent)), r,

// g, b);

// topText.setTextColor(changeToColor);

}

}

我的布局文件activity_main.xml是这样的:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent" >

<RelativeLayout

android:id="@+id/title"

android:layout_width="match_parent"

android:layout_height="48dp"

android:layout_alignParentTop="true"

android:background="@android:color/holo_red_dark" >

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center_horizontal"

android:text="标题" />

</RelativeLayout>

<com.example.myscrollview.MyScrollView

android:id="@+id/scroll"

android:layout_below="@id/title"

android:layout_width="match_parent"

android:layout_height="match_parent" >

<RelativeLayout

android:layout_width="match_parent"

android:layout_height="match_parent" >

<LinearLayout

android:id="@+id/lin"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:orientation="vertical" >

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="#fff"

android:padding="16dp"

android:text="hh阿迪和法国hius大hiugfhsdiuhgudhsiuahiudshfuihdsiuhhfsdkjhuiagfhsduiah加快速度哈更何况江苏打工记得书法家挥洒加快速度奋斗哈反抗集散地户籍卡hh"

android:textSize="40sp" />

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="#fff"

android:padding="16dp"

android:text="hh阿迪和法国hius大hiugfhsdiuhgudhsiuahiudshfuihdsiuhhfsdkjhuiagfhsduiah加快速度哈更何况江苏打工记得书法家挥洒加快速度奋斗哈反抗集散地户籍卡hh"

android:textSize="40sp" />

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="#fff"

android:padding="16dp"

android:text="hh阿迪和法国hius大hiugfhsdiuhgudhsiuahiudshfuihdsiuhhfsdkjhuiagfhsduiah加快速度哈更何况江苏打工记得书法家挥洒加快速度奋斗哈反抗集散地户籍卡hh"

android:textSize="40sp" />

<TextView

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:background="#fff"

android:padding="16dp"

android:text="hh阿迪和法国hius大hiugfhsdiuhgudhsiuahiudshfuihdsiuhhfsdkjhuiagfhsduiah加快速度哈更何况江苏打工记得书法家挥洒加快速度奋斗哈反抗集散地户籍卡hh"

android:textSize="40sp" />

</LinearLayout>

</RelativeLayout>

</com.example.myscrollview.MyScrollView>

</RelativeLayout>

是不是很简单,不用谢,请叫我雷锋。

时间: 2024-10-10 17:41:53

android中随着ScrollView的滑动,titleBar状态的改变的相关文章

解决Android中,禁止ScrollView内的控件改变之后自动滚动

问题: 最近在写一个程序界面,有一个scrollVIew,其中有一段内容是需要在线加载的. 当内容加载完成后,ScrollView中内容的长度会发生改变,这时ScrollView会自动下滚,如下图所示: 滚动的那一下体验特别不好,所以要防止这种情况.即不论Scrollview中内容如何,都要保持在最上. 解决办法: 先简单写一下我的xml文件的结构: [html] view plaincopy <ScrollView android:id="@+id/scrollView1" a

Android中不同方向嵌套滑动的解决方式(ListView为样例)

前言: 就像手机QQ的聊天消息列表.一个纵向滑动的ListView列举全部消息,但每一条消息能够横向滑动. 而默认情况下,仅仅能有一个地方消化处理触摸事件,要么ListView吃掉这个事件.要么子Item中能滑动的部件吃掉.两者互相冲突. 是否认为非常分裂?实现起来事实上不复杂. 理解了以后,能够方便延伸到GridView,ViewPager,ScrollView等等滑动控件. 假设对Andoroid触摸事件传递过程不熟悉,请看这里: 为了最简单表达实现方法,我以一个LinearLayout为L

Android中不同方向嵌套滑动的解决方案(ListView为例子)

前言:就像手机QQ的聊天消息列表,一个纵向滑动的ListView列举所有消息,但每一条消息可以横向滑动. 是否觉得很分裂?其实实现起来也不复杂. 理解了以后,可以方便延伸到GridView,ViewPager,ScrollView等等滑动控件. 如果对Andoroid触摸事件传递过程不熟悉,请看这里: 为了最简单表达实现方法,我以一个LinearLayout为ListView的Item,里面放了消息的TextView,和一个删除按钮 主要的思路是: 重写ListView中的Item,也就是Lin

Android中监听ListView滑动到底部

Android中的应用就是ListView中向下滑动加载更多的功能,不要再onScroll方法中进行判断,那样当滑动到底部的时候,可能我们需要触发点什么事件,比如加载更多.隐藏某个控件等等. 第一种方法是直接滑动到底部就触发 listview.setOnScrollListener(new OnScrollListener(){       @Override       public void onScrollStateChanged(AbsListView view, int scrollS

android中实现view可以滑动的六种方法

在android开发中,经常会遇到一个view需要它能够支持滑动的需求.今天就来总结实现其滑动的六种方法.其实每一种方法的 思路都是一样的,即:监听手势触摸的坐标来实现view坐标的变化,从而实现view的滑动效果. 一.通过Layout方法来实现滑动 如果你将滑动后的目标位置的坐标传递给Layout,这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. 这就是利用Layout方法实现滑动的核心思路.我们来看一下代码: 新建项目,然后自定义一个view,代码如下:

Android 监听ScrollView的滑动

我们需要监听ScroView的滑动情况,比如滑动了多少距离,是否滑到布局的顶部或者底部.可惜的是SDK并没有相应的方法,不过倒是提供了一个 protected void onScrollChanged(int l, int t, int oldl, int oldt) 显然这个方法是不能被外界调用的,因此就需要把它暴露出去,解决方式就是写一个接口 /** * Created by 刘楠 on 2016/8/21 0021.17:24 */ public interface ScrollViewL

android中实现view可以滑动的六种方法续篇(一)

承接上一篇,如果你没有读过前四章方法,可以点击下面的链接: http://www.cnblogs.com/fuly550871915/p/4985053.html 下面开始讲第五中方法. 五.利用Scroller类实现滑动 (1)基础知识总结 为了便于下面的阅读代码,先来总结一下关于Scroller类的基础知识.利用Scroller类实现滑动,需要三个步骤: 步骤一: 初始化Scroller对象,即mScroller = new Scroller(context)步骤二: 重写computeSc

解决Android中,禁止ScrollView内的控件改变之后自动滚动 - 转

问题: 最近在写一个程序界面,有一个scrollVIew,其中有一段内容是需要在线加载的. 当内容加载完成后,ScrollView中内容的长度会发生改变,这时ScrollView会自动下滚,如下图所示: 滚动的那一下体验特别不好,所以要防止这种情况.即不论Scrollview中内容如何,都要保持在最上. 解决办法: 先简单写一下我的xml文件的结构: [html] view plain copy <ScrollView android:id="@+id/scrollView1"

OA系统五彩种蓝色版现jin模式稳定无错 运营中版本Android中实现上下左右都可滑动的Scrol

OA系统五彩种蓝色版现jin模式稳定无错 下载地址 QQ 2952777280import java.util.List; import android.widget.FrameLayout; import android.content.Context; import android.graphics.Rect; import android.os.Handler; import android.util.AttributeSet; import android.view.FocusFinde