自定义控件之瀑布流与水波纹实现

本文主要讲述了利用android自定义控件实现瀑布流与水波纹效果

首先为实现效果,应了解touch事件在android中的传递机制

这里写图片描述

这里写图片描述

在执行touch事件时

  1. 首先执行dispatchTouchEvent方法,执行事件分发。

  2. 再执行onInterceptTouchEvent方法,判断是否中断事件,返回true时中断,执行自己的onTouchEvnet方法.

  3. 最后执行onTouchEvent方法,处理事件

瀑布流实现

首先定义三个listView竖起排列,并且配置适配器

public class MainActivity extends Activity {private ListView lv1;private ListView lv2;private ListView lv3;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lv1 = (ListView) findViewById(R.id.lv1);lv2 = (ListView) findViewById(R.id.lv2);lv3 = (ListView) findViewById(R.id.lv3);try {lv1.setAdapter(new MyAdapter1());lv2.setAdapter(new MyAdapter1());lv3.setAdapter(new MyAdapter1());} catch (Exception e) {e.printStackTrace();}}private int ids[] = new int[] { R.drawable.default1, R.drawable.girl1,R.drawable.girl2, R.drawable.girl3 };class MyAdapter1 extends BaseAdapter {@Overridepublic int getCount() {return 3000;}@Overridepublic Object getItem(int position) {return position;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {ImageView iv = (ImageView) View.inflate(getApplicationContext(),R.layout.lv_item, null);int resId = (int) (Math.random() * 4);iv.setImageResource(ids[resId]);return iv;}}
}

布局文件的配置

<com.example.pinterestlistview.MyLinearLayout 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:id="@+id/mll"tools:context=".MainActivity" ><ListViewandroid:id="@+id/lv2"android:scrollbars="none"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1" /><ListViewandroid:id="@+id/lv1"android:scrollbars="none"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1" /><ListViewandroid:id="@+id/lv3"android:scrollbars="none"android:layout_width="0dp"android:layout_height="wrap_content"android:layout_weight="1" /></com.example.pinterestlistview.MyLinearLayout>

自定义类截取事件分发

public class MyLinearLayout extends LinearLayout {public MyLinearLayout(Context context, AttributeSet attrs) {super(context, attrs);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {return true;}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {return super.dispatchTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent event) {int width=getWidth()/getChildCount();int height = getHeight();int count=getChildCount();float eventX = event.getX();if (eventX<width){  // 滑动左边的 listViewevent.setLocation(width/2, event.getY());getChildAt(0).dispatchTouchEvent(event);return true;} else if (eventX > width && eventX < 2 * width) { //滑动中间的 listView  float eventY = event.getY();if (eventY < height / 2) {event.setLocation(width / 2, event.getY());for (int i = 0; i < count; i++) {View child = getChildAt(i);try {child.dispatchTouchEvent(event);} catch (Exception e) {e.printStackTrace();}}return true;} else if (eventY > height / 2) {event.setLocation(width / 2, event.getY());try {getChildAt(1).dispatchTouchEvent(event);} catch (Exception e) {e.printStackTrace();}return true;}}else if (eventX>2*width){event.setLocation(width/2, event.getY());getChildAt(2).dispatchTouchEvent(event);return true;}return true;}}

完成,运行效果如下

如下

水波纹效果实现

要实现水波纹效果,只需用一个自定义控件填充整个Activity即可

  <com.zj.wave.MyWaveandroid:layout_width="fill_parent"android:layout_height="fill_parent"/>

自定义控件实现

/*** 水波纹效果* @author leo**/
public class MyRingWave extends View{/*** 二个相临波浪中心点的最小距离*/private static final int DIS_SOLP = 13;protected boolean isRunning = false;private ArrayList<Wave> wList;public MyRingWave(Context context, AttributeSet attrs) {super(context, attrs);wList = new ArrayList<MyRingWave.Wave>();}private Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {//刷新数据flushData();//刷新页面invalidate();//循环动画if (isRunning) {handler.sendEmptyMessageDelayed(0, 50);}};};@Overrideprotected void onDraw(Canvas canvas) {for (int i = 0; i < wList.size(); i++) {Wave wave = wList.get(i);canvas.drawCircle(wave.cx, wave.cy, wave.r, wave.p);}}@Overridepublic boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:int x = (int) event.getX();int y = (int) event.getY();addPoint(x,y);break;default:break;}return true; }/*** 添加新的波浪中心点* @param x* @param y*/private void addPoint(int x, int y) {if(wList.size() == 0){addPoint2List(x,y);/** 第一次启动动画*/isRunning = true;handler.sendEmptyMessage(0);}else{Wave w = wList.get(wList.size()-1);if(Math.abs(w.cx - x)>DIS_SOLP || Math.abs(w.cy-y)>DIS_SOLP){addPoint2List(x,y);}};}/*** 添加新的波浪* @param x* @param y*/private void addPoint2List(int x, int y) {Wave w = new Wave();w.cx = x;w.cy=y;Paint pa=new Paint();pa.setColor(colors[(int)(Math.random()*4)]);pa.setAntiAlias(true);pa.setStyle(Style.STROKE);w.p = pa;wList.add(w);}private int [] colors = new int[]{Color.BLUE,Color.RED,Color.YELLOW,Color.GREEN};/*** 刷新数据*/private void flushData() {for (int i = 0; i < wList.size(); i++) {Wave w = wList.get(i);//如果透明度为 0 从集合中删除int alpha = w.p.getAlpha();if(alpha == 0){wList.remove(i);    //删除i 以后,i的值应该再减1 否则会漏掉一个对象,不过,在此处影响不大,效果上看不出来。continue;}alpha-=5;if(alpha<5){alpha =0;}//降低透明度w.p.setAlpha(alpha);//扩大半径w.r = w.r+3;//设置半径厚度w.p.setStrokeWidth(w.r/3);}/** 如果集合被清空,就停止刷新动画*/if(wList.size() == 0){isRunning = false;}}/*** 定义一个波浪* @author leo*/private class Wave {//圆心int cx;int cy;//画笔Paint p;//半径int r;}
}

完成,效果如下

如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/494376.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

医学信息学相关术语、缩语及专业名词

医学信息学相关术语、缩语及专业名词 很棒哦&#xff0c;分享了&#xff0c;需要的可以去瞅瞅http://www.med-informatics.cn/MedInfo_gloss/medinfo_gloss_p1.htm如果你到它的完整上再逛逛&#xff0c;发觉还有很多好资源&#xff0c;譬如&#xff1a;http://www.med-informat…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 19丨最后一个能进入电梯的人【难度中等】​

【未来的你&#xff0c;会感谢今天努力的你】每日两题&#xff0c;一难一易&#xff0c;每天进步一点点&#xff0c;可能会直接导致一场面试的成功&#xff0c;或工作的轻松搞定&#xff0c;从而升职加薪迎娶白富美&#xff0c;加油小伙伴&#xff01; &#x1f345;举办场地&a…

神经网络并不是尚方宝剑,我们需要正视深度 NLP 模型的泛化问题

来源&#xff1a;AI 科技评论前段时间的文章《顶会见闻系列&#xff1a;ACL 2018&#xff0c;在更具挑战的环境下理解数据表征及方法评价》中&#xff0c;我们介绍了 ACL 大会上展现出的 NLP 领域的最新研究风向和值得关注的新进展。从这些新动向上我们似乎应该对深度学习 NLP …

Android之XML序列化和解析

XML文件是一种常用的文件格式&#xff0c;可以用来存储与传递数据 &#xff0c;本文是XML文件序列化与解析的一个简单示例 写文件到本地&#xff0c;并用XML格式存储 /*** 写xml文件到本地*/private void writeXmlToLocal() {List<Person> personList getPersonList()…

北京智控美信(长春)数据中心应聘总结

时间&#xff1a; 2012年9月12日 公司介绍&#xff1a; IT外包公司&#xff0c;提供咨询——开发——维护的整套服务。涉及金融、石油、电力等行业。 代表性项目&#xff1a; 吉林银行的先进性系统。 简历投递&#xff1a; 发送到邮箱&#xff1a;kd.hrinfohold.com.cn (注明应…

信息技术智库丨月度大考试

【未来的你&#xff0c;会感谢今天努力的你】每日两题&#xff0c;一难一易&#xff0c;每天进步一点点&#xff0c;可能会直接导致一场面试的成功&#xff0c;或工作的轻松搞定&#xff0c;从而升职加薪迎娶白富美&#xff0c;加油小伙伴&#xff01; &#x1f345;举办场地&a…

Android之查看网络图片和网页HTML

网络编程是Android应用中很重要的一部分&#xff0c;本文主要讲述了利用HttpURLConnection获取网络图片和HTML的方法。 获取网络图片 public class MainActivity extends Activity implements OnClickListener {private static final String TAG "MainActivity";p…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 20丨查询球队积分【难度中等】​

【未来的你&#xff0c;会感谢今天努力的你】每日两题&#xff0c;一难一易&#xff0c;每天进步一点点&#xff0c;可能会直接导致一场面试的成功&#xff0c;或工作的轻松搞定&#xff0c;从而升职加薪迎娶白富美&#xff0c;加油小伙伴&#xff01; &#x1f345;举办场地&a…

来博客园开了个博客

平时搜索资料也经常搜到博客园的文章&#xff0c;我一看&#xff0c;支持代码高亮&#xff0c;就注册了&#xff0c;也开了个。 以前辗转好多个博客&#xff0c;都没坚持&#xff0c;后来都废弃了。转载于:https://www.cnblogs.com/dyllen/archive/2013/01/31/2887383.html

智能交通大数据及云应用平台解决方案

来源&#xff1a;网络大数据摘要&#xff1a;随着日益增长的交通“大数据”&#xff0c;给交通管理创新带来的新挑战&#xff0c;以及对交通管理工作提出的新要求&#xff0c;交通信息化建设必然步入云计算智慧应用阶段&#xff0c;利用云计算破解当前诸多交通瓶颈问题。什么是…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 20丨查询结果的质量和占比【难度简单】​

【未来的你&#xff0c;会感谢今天努力的你】每日两题&#xff0c;一难一易&#xff0c;每天进步一点点&#xff0c;可能会直接导致一场面试的成功&#xff0c;或工作的轻松搞定&#xff0c;从而升职加薪迎娶白富美&#xff0c;加油小伙伴&#xff01; &#x1f345;举办场地&a…

Android之网络编程

本文主要包括三方面内容 Httpurlconnection中doGet与doPost方法实现提交数据到服务器HttpClient中doGet与doPost方法实现提交数据到服务器android-async-http开源库方法实现提交数据到服务器 首先是服务器端的实现 public class LoginServlet extends HttpServlet {/*** Th…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 21丨每个帖子的评论数【难度中等】​

【未来的你&#xff0c;会感谢今天努力的你】每日两题&#xff0c;一难一易&#xff0c;每天进步一点点&#xff0c;可能会直接导致一场面试的成功&#xff0c;或工作的轻松搞定&#xff0c;从而升职加薪迎娶白富美&#xff0c;加油小伙伴&#xff01; &#x1f345;举办场地&a…

获取当前程序运行的主机名称

#region 获取主机名称 /// <summary> /// 获取主机名称 返回如 www.baidu.com or www.baidu.com:8080 注意没有 http:// /// </summary> /// <returns></returns> public static string GetHttpHost() …

106项人工智能创新项目名单公布,唱响“智能化”主旋律

来源&#xff1a;专知摘要&#xff1a;9月5日&#xff0c;工信部官网公示了2018年人工智能与实体经济深度融合创新项目名单。9月5日&#xff0c;工信部官网公示了2018年人工智能与实体经济深度融合创新项目名单。据了解&#xff0c;2018年人工智能与实体经济深度融合创新项目名…

利用TabWidget实现底部菜单

TabWidget类似于通话记录的界面&#xff0c;通过切换多个标签从而显示出多个不同内容&#xff0c;能够展示内容丰富的页面信息&#xff0c;而且彼此之间不会干扰&#xff0c;有利于展示。下面&#xff0c;通过一个例子来学习用法 首先用一个类来继承TabActivity 在开发之前&a…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 21丨报告系统状态的连续日期【难度困难】​

【未来的你&#xff0c;会感谢今天努力的你】每日两题&#xff0c;一难一易&#xff0c;每天进步一点点&#xff0c;可能会直接导致一场面试的成功&#xff0c;或工作的轻松搞定&#xff0c;从而升职加薪迎娶白富美&#xff0c;加油小伙伴&#xff01; &#x1f345;举办场地&a…

MySQL Connector/ODBC 5.2.4 发布

MySQL 御用的 ODBC 驱动程序发布了 5.2.4 版本&#xff0c;下载地址&#xff1a; http://dev.mysql.com/downloads/connector/odbc/5.2.html 没有改进说明&#xff01; 转载于:https://www.cnblogs.com/shihao/archive/2013/02/06/2901851.html

信通院2018人工智能发展白皮书技术篇重磅发布

来源&#xff1a;网路大数据9月6日&#xff0c;2018中国人工智能峰会(CAIS2018)在南京国际博览会议中心召开。斯坦福客座教授吴恩达以Landng.ai创始人、CEO的身份出席了峰会&#xff0c;并在主论坛上做了题为《人工智能赋能新时代》的主题演讲。除了各路大咖的精彩演讲之外&…

【每日SQL打卡】​​​​​​​​​​​​​​​DAY 22丨页面推荐【难度中等】​

【未来的你&#xff0c;会感谢今天努力的你】每日两题&#xff0c;一难一易&#xff0c;每天进步一点点&#xff0c;可能会直接导致一场面试的成功&#xff0c;或工作的轻松搞定&#xff0c;从而升职加薪迎娶白富美&#xff0c;加油小伙伴&#xff01; &#x1f345;举办场地&a…