Android搜索栏平滑过渡
来源:互联网 发布:淘宝店面怎么装修模板 编辑:程序博客网 时间:2024/05/18 20:32
写在前面,本文所有代码及样式来自Wing大神。
http://blog.csdn.net/wingichoy/article/details/53968968
上面是原文链接
好了,上一篇文章学着使用android共享元素做界面跳转,后来浏览Wing神的博客,发现他更新了新的文章,于是立马照着敲了一遍。
看起来一模一样 0.0
这个demo共有两个类:MainActivity,TwoActivity
MainActivity的布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.a69107.demo2.MainActivity"> <FrameLayout android:layout_width="match_parent" android:background="@android:color/holo_blue_light" android:layout_height="150dp"> <TextView android:layout_width="match_parent" android:layout_height="45dp" android:layout_gravity="top" android:paddingLeft="15dp" android:gravity="bottom" android:text="Title" android:textColor="@android:color/white" /> <TextView android:id="@+id/tv_main" android:layout_width="match_parent" android:layout_height="45dp" android:background="@drawable/ele_search_bg" android:layout_gravity="center" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:textColor="@android:color/white" android:transitionName="shareTransition" /> <TextView android:layout_width="match_parent" android:layout_height="45dp" android:layout_gravity="center" android:gravity="center" android:text="请输入搜索内容" android:textColor="@android:color/black" android:transitionName="shareTransition" /> <TextView android:layout_width="match_parent" android:layout_height="45dp" android:gravity="center_vertical" android:layout_gravity="bottom" android:paddingLeft="15dp" android:textColor="@android:color/white" android:text="我是无关文字" /> </FrameLayout> <TextView android:layout_width="match_parent" android:layout_height="45dp" android:gravity="center" android:text="我是无关文字" /> <TextView android:layout_width="match_parent" android:layout_height="45dp" android:gravity="center" android:text="我是无关文字" /></LinearLayout>
界面是这样的
MainActivity类代码
public class MainActivity extends AppCompatActivity { private TextView tv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv=(TextView) findViewById(R.id.tv_main); tv.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(MainActivity.this,TwoActivity.class); //获取控件在屏幕中的坐标 int location[] = new int[2]; tv.getLocationOnScreen(location); intent.putExtra("x",location[0]); intent.putExtra("y",location[1]); startActivity(intent); overridePendingTransition(0,0); } }); }}
TwoActivity的布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/two" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.example.a69107.demo2.MainActivity"> <FrameLayout android:layout_width="match_parent" android:layout_height="150dp" android:background="@android:color/holo_blue_light" android:paddingTop="5dp"> <TextView android:id="@+id/et_bg" android:layout_width="match_parent" android:layout_height="45dp" android:layout_gravity="top" android:layout_marginLeft="15dp" android:layout_marginRight="15dp" android:background="@drawable/ele_search_bg" android:textColor="@android:color/white" android:transitionName="shareTransition" /> <TextView android:id="@+id/et_content" android:layout_width="match_parent" android:layout_height="45dp" android:layout_gravity="top" android:gravity="center" android:text="请输入搜索内容" android:textColor="@android:color/black" android:transitionName="shareTransition" /> <ImageView android:id="@+id/iv_arrow" android:layout_width="20dp" android:layout_height="20dp" android:layout_gravity="top|left" android:layout_marginLeft="10dp" android:layout_marginTop="12dp" android:gravity="center" android:src="@drawable/arrow_right" /> <TextView android:id="@+id/search_btn" android:layout_width="wrap_content" android:layout_height="45dp" android:layout_gravity="top|right" android:layout_marginRight="10dp" android:gravity="center" android:text="搜索" android:textColor="@android:color/white" android:transitionName="shareTransition" /> </FrameLayout> <FrameLayout android:id="@+id/fl" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/white" android:gravity="center"> </FrameLayout></LinearLayout>
界面是这样的,话说大家发现搜索那个框与左面的箭头,右面的文字重叠了么,这个是在代码里控制的,开始我还特意加了margin,但在界面跳转中搜索框会骤然缩小一下,之后发现在代码里控制了搜索框的宽度,再加上margin的话就会有问题了。
TwoActivity类代码
public class TwoActivity extends AppCompatActivity { private TextView et_bg; private TextView et_content; private ImageView back; private TextView tv_search; private FrameLayout fl; private boolean finishing; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_two); et_bg=(TextView) findViewById(R.id.et_bg); et_content=(TextView) findViewById(R.id.et_content); fl=(FrameLayout)findViewById(R.id.fl); back=(ImageView)findViewById(R.id.iv_arrow); tv_search=(TextView) findViewById(R.id.search_btn); et_bg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(!finishing){ finishing=true; outAnimation(); } } }); //监听布局是否发生变化 et_bg.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { et_bg.getViewTreeObserver().removeOnGlobalLayoutListener(this); inAnimation(); } }); } private void inAnimation() { float originY=getIntent().getIntExtra("y",0); //获取到搜索框在TwoActivity界面的位置 int[] location=new int[2]; et_bg.getLocationOnScreen(location); //计算位置的差值 final float translateY=originY-(float)location[1]; //将第一个界面的位置设置给搜索框 et_bg.setY(et_bg.getY()+translateY); //同步设置搜索框中的文字 et_content.setY(et_bg.getY()+(et_bg.getHeight()-et_content.getHeight())/2); float top = getResources().getDisplayMetrics().density * 20; //ValueAnimator是一个很厉害的东西,你只需要给他初始值和结束值,他会自动计算中间的过度 final ValueAnimator translateVa = ValueAnimator.ofFloat(et_bg.getY(), top); //这个是由下移动到上面的监听 translateVa.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { et_bg.setY((Float) valueAnimator.getAnimatedValue()); et_content.setY(et_bg.getY() + (et_bg.getHeight() - et_content.getHeight()) / 2); back.setY(et_bg.getY() + (et_bg.getHeight() - back.getHeight()) / 2); tv_search.setY(et_bg.getY() + (et_bg.getHeight() - tv_search.getHeight()) / 2); } }); //这个是缩小搜索框的监听 ValueAnimator scaleVa = ValueAnimator.ofFloat(1, 0.8f); scaleVa.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { et_bg.setScaleX((Float) valueAnimator.getAnimatedValue()); } }); //这个是设置透明度 ValueAnimator alphaVa = ValueAnimator.ofFloat(0, 1f); alphaVa.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { back.setAlpha((Float) valueAnimator.getAnimatedValue()); tv_search.setAlpha((Float) valueAnimator.getAnimatedValue()); fl.setAlpha((Float) valueAnimator.getAnimatedValue()); } }); alphaVa.setDuration(500); translateVa.setDuration(500); scaleVa.setDuration(500); alphaVa.start(); translateVa.start(); scaleVa.start(); } private void outAnimation() { float originY=getIntent().getIntExtra("y",0); int[] location=new int[2]; et_bg.getLocationOnScreen(location); final float translateY=originY-(float)location[1]; et_bg.setY(et_bg.getY()+translateY); et_content.setY(et_bg.getY()+(et_bg.getHeight()-et_content.getHeight())/2); float top = getResources().getDisplayMetrics().density * 20; final ValueAnimator translateVa = ValueAnimator.ofFloat(top, et_bg.getY()); translateVa.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { et_bg.setY((Float) valueAnimator.getAnimatedValue()); et_content.setY(et_bg.getY() + (et_bg.getHeight() - et_content.getHeight()) / 2); back.setY(et_bg.getY() + (et_bg.getHeight() - back.getHeight()) / 2); tv_search.setY(et_bg.getY() + (et_bg.getHeight() - tv_search.getHeight()) / 2); } }); translateVa.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animator) { } @Override public void onAnimationEnd(Animator animator) { finish(); overridePendingTransition(0, 0); } @Override public void onAnimationCancel(Animator animator) { } @Override public void onAnimationRepeat(Animator animator) { } }); ValueAnimator scaleVa = ValueAnimator.ofFloat(0.8f, 1); scaleVa.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { et_bg.setScaleX((Float) valueAnimator.getAnimatedValue()); } }); ValueAnimator alphaVa = ValueAnimator.ofFloat(1f, 0); alphaVa.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { back.setAlpha((Float) valueAnimator.getAnimatedValue()); tv_search.setAlpha((Float) valueAnimator.getAnimatedValue()); fl.setAlpha((Float) valueAnimator.getAnimatedValue()); } }); alphaVa.setDuration(500); translateVa.setDuration(500); scaleVa.setDuration(500); alphaVa.start(); translateVa.start(); scaleVa.start(); } @Override public void onBackPressed() { if(!finishing){ finishing=true; outAnimation(); } }}
好的,就是这些了。
最后感谢Wing神带给我们的技术分享。
0 0
- Android搜索栏平滑过渡
- Android color 平滑过渡计算
- android平滑过渡的动画效果
- Android使用TextSwitcher和ImageSwitcher实现平滑过渡
- Android buttom textview 颜色平滑过渡的动画效果
- android 开发技巧(5)--使 用 TextSwitcher 实现平滑过渡
- Android 如何实现一个平滑过渡的ViewPager广告条
- Android 如何实现一个平滑过渡的ViewPager广告条
- html5 学习--平滑过渡
- iOS透明导航栏的平滑过渡(进阶版)
- iOS透明导航栏的平滑过渡(进阶版)
- iOS透明导航栏的平滑过渡(进阶版)
- smoothstep(),平滑阶梯函数,平滑过渡函数
- Unity3d摄像机的平滑过渡
- UIImageView 平滑过渡图片切换
- 【android】平滑Activity过渡动画效果,类库已分离,使用只需1行代码
- Android实现真正的ViewPager【平滑过渡】+【循环滚动】!!!顺带还有【末页跳转】。
- 平滑的 CSS3 和 jquery 过渡动画
- HBase过滤器
- ZCMU-1445-Repeat Number
- AndroidMainfest.xml详解——minSdkVersion,targetSdkVersion
- Java如何定位占用CPU比较高的问题
- '$.data(...).panel' 为空或不是对象 问题解决
- Android搜索栏平滑过渡
- [leetcode]384. Shuffle an Array
- bzoj3875 [Ahoi2014]骑士游戏
- MVC设计模式学习总结
- JDBC连接数据库的步骤
- [【备忘】传智播客ios第五期[更新完毕-共享完毕] 共109G
- 如何清除电脑里无用的服务项和系统服务列表中的残留服务
- MHA配置
- hex码和ascii码的转换