仿百度壁纸client(五)——实现搜索动画GestureDetector手势识别,动态更新搜索关键字


百度壁纸系列

仿百度壁纸client(一)——主框架搭建,自己定义Tab + ViewPager + Fragment

仿百度壁纸client(二)——主页自己定义ViewPager广告定时轮播图

仿百度壁纸client(三)——首页单向。双向事件冲突处理,壁纸列表的实现

仿百度壁纸client(四)——自己定义上拉载入实现精选壁纸墙

仿百度壁纸client(五)——实现搜索动画GestureDetector手势识别,动态更新搜索关键字

仿百度壁纸client(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化


我们又一次来看看这个效果

想实现这个逻辑,事实上就是监听两个View的显示隐藏加上一点小动画,所以我们在布局上是这种

search_fragment.xml

<?

xml version="1.0" encoding="utf-8"?

>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <AbsoluteLayout android:id="@+id/myLayoutOne" android:layout_width="match_parent" android:layout_height="match_parent"> </AbsoluteLayout> <AbsoluteLayout android:id="@+id/myLayoutTwo" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone"> </AbsoluteLayout> </RelativeLayout>

这两个布局我们去填充数据,首先我们把要初始化的东西都初始化好

/*** 找控件** @param view*/private void findView(View view) {//设置触摸,手势view.setLongClickable(true);view.setOnTouchListener(new MyOnTouch());//初始化手势gest = new GestureDetector(getActivity(), new MyGest());myLayoutOne = (AbsoluteLayout) view.findViewById(R.id.myLayoutOne);myLayoutTwo = (AbsoluteLayout) view.findViewById(R.id.myLayoutTwo);}

紧接着我们就能够去获取对应的数据了

/*** 初始化*/private void init() {//获取屏幕的像素,兴许随机分布关键字DisplayMetrics metrics = new DisplayMetrics();getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);//获取到屏幕的宽mWidth = metrics.widthPixels;//初始化数据initData();//设置默认数据setData(myLayoutOne, index);}**重点内容**

获取到数据之后我们就開始初始化这些数据

/*** 初始化数据*/private void initData() {//两个页面for (int i = 0; i < 2; i++) {switch (i) {case 0:ArrayList<String> newDataOne = new ArrayList<>();//15个数据for (int j = 0; j < 15; j++) {//实际开发中数据还是得从server获取newDataOne.add("海贼王");}//加入数据data.add(newDataOne);break;case 1:ArrayList<String> newDataTwo = new ArrayList<>();//15个数据for (int j = 0; j < 15; j++) {newDataTwo.add("火影忍者");}//加入数据data.add(newDataTwo);break;}}}

这样我们就能够来进行随机分布的计算

/*** 设置默认的数据** @param myLayout* @param index*/private void setData(AbsoluteLayout myLayout, int index) {//每次载入之前清除myLayout.removeAllViews();//有数据了之后開始随机分布了int startY = 50;//X动态生成,推断是第几页的数据,左右两边间距50,用户体验for (int i = 0; i < data.get(index).size(); i++) {int x = get(50, mWidth - 50);int y = startY;//文本显示TextView tv = new TextView(getActivity());tv.setTextSize(12);//随机tv.setText(data.get(index).get(i));/*** 高,宽,x,y*/AbsoluteLayout.LayoutParams layout = new AbsoluteLayout.LayoutParams(100, 50, x, y);myLayout.addView(tv, layout);//開始随机分布startY += 50;}}/*** 随机生成一个坐标** @param min* @param max* @return*/private int get(int min, int max) {//从最大到最小的随机数值return new Random().nextInt(max) % (max - min + 1) + min;}

当我们要加入手势的时候,我们就能够把触摸事件传递给手势事件

 /*** View的触摸事件*/private class MyOnTouch implements View.OnTouchListener {@Overridepublic boolean onTouch(View v, MotionEvent event) {//触摸事件传递给手势return gest.onTouchEvent(event);}}

接着我们来处理滑产生的操作

/*** 手势监听*/private class MyGest implements GestureDetector.OnGestureListener {//按下@Overridepublic boolean onDown(MotionEvent e) {return false;}@Overridepublic void onShowPress(MotionEvent e) {}@Overridepublic boolean onSingleTapUp(MotionEvent e) {return false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {return false;}@Overridepublic void onLongPress(MotionEvent e) {}//滑动@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {//左边——右边滑动if (e1.getX() < e2.getX()) {index++;//越界处理if (index == data.size()) {index = 0;}//推断显示内容switch (myLayoutOne.getVisibility()) {//VISIBLEcase 0://动画而且显示。消失setState(VISIBLE);setState(GONE);break;//INVISIBLEcase 4://GONEcase 8://动画而且显示,消失setState(VISIBLE1);setState(GONE1);break;}}return false;}}

我们仅仅要去动态的改变他的UI。所以。这里我们写了这样一个方法

/*** 动态改变状态** @param i*/private void setState(final int i) {//UI刷新new Thread(new Runnable() {@Overridepublic void run() {handler.sendEmptyMessage(i);}}).start();}

当接收到handler的时候

/*** 子线程*/private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case VISIBLE:setAnim(myLayoutOne, 1000, 0);myLayoutOne.setVisibility(View.GONE);break;case GONE:setData(myLayoutTwo,index);setAnimTwo(myLayoutTwo, 2000, 0);myLayoutTwo.setVisibility(View.VISIBLE);break;case VISIBLE1:setAnimTwo(myLayoutTwo, 2000, 0);myLayoutTwo.setVisibility(View.VISIBLE);break;case GONE1:setData(myLayoutOne,index);setAnim(myLayoutOne, 1000, 0);myLayoutOne.setVisibility(View.GONE);break;}super.handleMessage(msg);}};

我们就能够进行动画了。无非就是两个视图动画。他们的坐标刚好相反

 * 设置Two动画** @param myLayout  控件* @param time      显示时间* @param deLayTime 延迟时间*/private void setAnimTwo(AbsoluteLayout myLayout, int time, int deLayTime) {//缩放动画ScaleAnimation scale = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);scale.setDuration(time);scale.setStartOffset(deLayTime);//渐变AlphaAnimation alp = new AlphaAnimation(0.0f, 1.0f);alp.setDuration(time);alp.setStartOffset(deLayTime);//组合动画AnimationSet set = new AnimationSet(true);set.addAnimation(scale);set.addAnimation(alp);//開始动画myLayout.startAnimation(set);}/*** 设置One动画** @param myLayout  控件* @param time      显示时间* @param deLayTime 延迟时间*/private void setAnim(AbsoluteLayout myLayout, int time, int deLayTime) {//缩放动画ScaleAnimation scale = new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);scale.setDuration(time);scale.setStartOffset(deLayTime);//渐变AlphaAnimation alp = new AlphaAnimation(1.0f, 0.0f);alp.setDuration(time);alp.setStartOffset(deLayTime);//组合动画AnimationSet set = new AnimationSet(true);set.addAnimation(scale);set.addAnimation(alp);//開始动画myLayout.startAnimation(set);}

这里贴上完整代码。Demo就不上传了,xml和代码都有。直接放上去即可

SearchFragment

package com.lgl.baiduwallpaper.fragment;import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.util.DisplayMetrics;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AlphaAnimation;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.ScaleAnimation;
import android.widget.AbsoluteLayout;
import android.widget.TextView;import com.lgl.baiduwallpaper.R;import java.util.ArrayList;
import java.util.Random;/*** 搜索* Created by lgl on 16/3/31.*/
public class SearchFragment extends Fragment {//显示private static final int VISIBLE = 1;//隐藏private static final int GONE = 2;//显示private static final int VISIBLE1 = 3;//隐藏private static final int GONE1 = 4;private AbsoluteLayout myLayoutOne, myLayoutTwo;//标记private int index = 0;//进行数据存储private ArrayList<ArrayList<String>> data = new ArrayList<ArrayList<String>>();//屏幕的宽private int mWidth;//手势private GestureDetector gest;/*** 子线程*/private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case VISIBLE:setAnim(myLayoutOne, 1000, 0);myLayoutOne.setVisibility(View.GONE);break;case GONE:setData(myLayoutTwo,index);setAnimTwo(myLayoutTwo, 2000, 0);myLayoutTwo.setVisibility(View.VISIBLE);break;case VISIBLE1:setAnimTwo(myLayoutTwo, 2000, 0);myLayoutTwo.setVisibility(View.VISIBLE);break;case GONE1:setData(myLayoutOne,index);setAnim(myLayoutOne, 1000, 0);myLayoutOne.setVisibility(View.GONE);break;}super.handleMessage(msg);}};/*** 设置Two动画** @param myLayout  控件* @param time      显示时间* @param deLayTime 延迟时间*/private void setAnimTwo(AbsoluteLayout myLayout, int time, int deLayTime) {//缩放动画ScaleAnimation scale = new ScaleAnimation(0.0f, 1.0f, 0.0f, 1.0f, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);scale.setDuration(time);scale.setStartOffset(deLayTime);//渐变AlphaAnimation alp = new AlphaAnimation(0.0f, 1.0f);alp.setDuration(time);alp.setStartOffset(deLayTime);//组合动画AnimationSet set = new AnimationSet(true);set.addAnimation(scale);set.addAnimation(alp);//開始动画myLayout.startAnimation(set);}/*** 设置One动画** @param myLayout  控件* @param time      显示时间* @param deLayTime 延迟时间*/private void setAnim(AbsoluteLayout myLayout, int time, int deLayTime) {//缩放动画ScaleAnimation scale = new ScaleAnimation(1.0f, 1.5f, 1.0f, 1.5f, Animation.RELATIVE_TO_PARENT, 0.5f, Animation.RELATIVE_TO_PARENT, 0.5f);scale.setDuration(time);scale.setStartOffset(deLayTime);//渐变AlphaAnimation alp = new AlphaAnimation(1.0f, 0.0f);alp.setDuration(time);alp.setStartOffset(deLayTime);//组合动画AnimationSet set = new AnimationSet(true);set.addAnimation(scale);set.addAnimation(alp);//開始动画myLayout.startAnimation(set);}@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.search_fragment, container, false);findView(view);return view;}/*** 找控件** @param view*/private void findView(View view) {//设置触摸,手势view.setLongClickable(true);view.setOnTouchListener(new MyOnTouch());//初始化手势gest = new GestureDetector(getActivity(), new MyGest());myLayoutOne = (AbsoluteLayout) view.findViewById(R.id.myLayoutOne);myLayoutTwo = (AbsoluteLayout) view.findViewById(R.id.myLayoutTwo);}@Overridepublic void onActivityCreated(Bundle savedInstanceState) {super.onActivityCreated(savedInstanceState);init();}/*** 初始化*/private void init() {//获取屏幕的像素。兴许随机分布关键字DisplayMetrics metrics = new DisplayMetrics();getActivity().getWindowManager().getDefaultDisplay().getMetrics(metrics);//获取到屏幕的宽mWidth = metrics.widthPixels;//初始化数据initData();//设置默认数据setData(myLayoutOne, index);}/*** 初始化数据*/private void initData() {//两个页面for (int i = 0; i < 2; i++) {switch (i) {case 0:ArrayList<String> newDataOne = new ArrayList<>();//15个数据for (int j = 0; j < 15; j++) {//实际开发中数据还是得从server获取newDataOne.add("海贼王");}//加入数据data.add(newDataOne);break;case 1:ArrayList<String> newDataTwo = new ArrayList<>();//15个数据for (int j = 0; j < 15; j++) {newDataTwo.add("火影忍者");}//加入数据data.add(newDataTwo);break;}}}/*** 设置默认的数据** @param myLayout* @param index*/private void setData(AbsoluteLayout myLayout, int index) {//每次载入之前清除myLayout.removeAllViews();//有数据了之后開始随机分布了int startY = 50;//X动态生成,推断是第几页的数据,左右两边间距50,用户体验for (int i = 0; i < data.get(index).size(); i++) {int x = get(50, mWidth - 50);int y = startY;//文本显示TextView tv = new TextView(getActivity());tv.setTextSize(12);//随机tv.setText(data.get(index).get(i));/*** 高,宽。x,y*/AbsoluteLayout.LayoutParams layout = new AbsoluteLayout.LayoutParams(100, 50, x, y);myLayout.addView(tv, layout);//開始随机分布startY += 50;}}/*** 随机生成一个坐标** @param min* @param max* @return*/private int get(int min, int max) {//从最大到最小的随机数值return new Random().nextInt(max) % (max - min + 1) + min;}/*** View的触摸事件*/private class MyOnTouch implements View.OnTouchListener {@Overridepublic boolean onTouch(View v, MotionEvent event) {//触摸事件传递给手势return gest.onTouchEvent(event);}}/*** 手势监听*/private class MyGest implements GestureDetector.OnGestureListener {//按下@Overridepublic boolean onDown(MotionEvent e) {return false;}@Overridepublic void onShowPress(MotionEvent e) {}@Overridepublic boolean onSingleTapUp(MotionEvent e) {return false;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {return false;}@Overridepublic void onLongPress(MotionEvent e) {}//滑动@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {//左边——右边滑动if (e1.getX() < e2.getX()) {index++;//越界处理if (index == data.size()) {index = 0;}//推断显示内容switch (myLayoutOne.getVisibility()) {//VISIBLEcase 0://动画而且显示。消失setState(VISIBLE);setState(GONE);break;//INVISIBLEcase 4://GONEcase 8://动画而且显示。消失setState(VISIBLE1);setState(GONE1);break;}}return false;}}/*** 动态改变状态** @param i*/private void setState(final int i) {//UI刷新new Thread(new Runnable() {@Overridepublic void run() {handler.sendEmptyMessage(i);}}).start();}
}

我们来执行一下

这里有个隐藏小bug,不知各位看官可否发现了当中的小失误,哈哈

转载于:https://www.cnblogs.com/lxjshuju/p/7226921.html

仿百度壁纸client(五)——实现搜索动画GestureDetector手势识别,动态更新搜索keyword...相关推荐

  1. 仿百度壁纸客户端(五)——实现搜索动画GestureDetector手势识别,动态更新搜索关键字

    仿百度壁纸客户端(五)--实现搜索动画GestureDetector手势识别,动态更新搜索关键字 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Frag ...

  2. 仿百度壁纸客户端(五)——实现搜索动画GestureDetector手势识别,动态更新搜索关键字...

    仿百度壁纸客户端(五)--实现搜索动画GestureDetector手势识别,动态更新搜索关键字 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Frag ...

  3. 仿百度壁纸client(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化...

    仿百度壁纸client(六)--完结篇之Gallery画廊实现壁纸预览已经项目细节优化 百度壁纸系列 仿百度壁纸client(一)--主框架搭建,自己定义Tab + ViewPager + Fragm ...

  4. 仿百度壁纸客户端(四)——自定义上拉加载实现精选壁纸墙

    仿百度壁纸客户端(四)--自定义上拉加载实现精选壁纸墙 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度壁纸客户端(二)--主页自 ...

  5. 仿百度壁纸客户端(三)——首页单向,双向事件冲突处理,壁纸列表的实现

    仿百度壁纸客户端(三)--首页单向,双向事件冲突处理,壁纸列表的实现 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度壁纸客户端( ...

  6. 仿百度壁纸客户端(三)——首页单向,双向事件冲突处理,壁纸列表的实现...

    仿百度壁纸客户端(三)--首页单向,双向事件冲突处理,壁纸列表的实现 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度壁纸客户端( ...

  7. 仿百度壁纸客户端(一)——主框架搭建,自定义Tab+ViewPager+Fragment

    仿百度壁纸客户端(一)--主框架搭建,自定义Tab+ViewPager+Fragment 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment ...

  8. 仿百度壁纸客户端(六)——完结篇之Gallery画廊实现壁纸预览已经项目细节优化

    仿百度壁纸客户端(六)--完结篇之Gallery画廊实现壁纸预览已经项目细节优化 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度 ...

  9. 仿百度壁纸客户端(二)——主页自定义ViewPager广告定时轮播图

    仿百度壁纸客户端(二)--主页自定义ViewPager广告定时轮播图 百度壁纸系列 仿百度壁纸客户端(一)--主框架搭建,自定义Tab + ViewPager + Fragment 仿百度壁纸客户端( ...

最新文章

  1. html中content属性,CSS3的content属性用法详解
  2. 《云数据管理:挑战与机遇》2.3.3 恢复和提交
  3. [图解]在输入框和文本框中获取和设置光标位置,以及选中文本和获取选中文本值的方法 --- 详解,兼容所有浏览器。...
  4. Android 编译系统分析(二)
  5. 50条超精辟的经典语录:哗众,可以取宠,也可以失宠!
  6. JLBH示例2 –协调遗漏的会计处理
  7. Vue Google浏览器插件 Vue Devtools无法使用的解决办法
  8. MongoDB入门 - 安装教程
  9. MBA已经全面***“中国式教育”!
  10. Docker(四) Dockerfile 详解
  11. C++ + Irrlicht整一个东东?
  12. 关于驰骋工作流程引擎节点访问规则的变更发布
  13. AR 第一大单,微软 219 亿美元为美军打造高科技头盔
  14. OpenTCS打造移动机器人交通管制系统(三)
  15. Migration——迁移
  16. vscode——记单词插件Qwerty Learner
  17. 用计算机绘制函数图像数学大师,什么手机app可以画函数图像 能画函数图像的app推荐...
  18. java特征向量计算_Java与Python计算特征向量的区别
  19. Failed to calculate the value of task ‘:CordovaLib:compileDebugJavaWithJavac‘
  20. Composer 使用简单教程

热门文章

  1. 填谷式无源pfc电路_无源PFC讲解--LED驱动电源
  2. CentOs7 安装Docker 并配置代理访问外网
  3. SpringBoot购物推荐体育用品商城
  4. Unity发现字体模糊怎么办
  5. 优秀的CAD看图软件VOW Desktop
  6. 学历不高,没有一技之长,性格还内向,我应该找什么工作?
  7. [转]我们需要什么样的游戏
  8. 【Go语言刷题篇】Go完结篇|函数、结构体、接口、错误入门学习
  9. libtorch学习笔记(16)- Faste-RCNN的RPN如何训练以及训练的参数集
  10. unimrcp的voice activity dector