位置: 编程技术 - 正文

Android之自定义(上方标题随ViewPager手势慢慢滑动)(安卓自定义app)

编辑:rootadmin
最近很蛋疼,项目要模仿网易新闻的样式去做。上次把仿网易新闻客户端的下拉刷新写出来了,这次是ViewPager的滑动,同时ViewPager的上面标题下划线跟随者移动,本来通过ViewPager的OnPagerChangeListener的监听事件就可以完成,但是做出来之后,因为需要一直的刷新,所以很卡,一气之下,呵呵,自己完全的画了。整个点击事件,滑动事件都自己处理了。效果图如下: 下标的长宽是随之改变的。使用方式:我的布局文件:<LinearLayout xmlns:android=" xmlns:tools=" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.flyme.columnhorizontalscrollview.ColumnHorizontalScrollView android:layout_width="match_parent" android:paddingLeft="dip" android:paddingRight="dip" android:layout_height="dip" android:id="@&#;id/title" /> <android.support.v4.view.ViewPager android:background="@android:color/holo_orange_light" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@&#;id/viewpager" /> </LinearLayout> 很简单,把自定义的布局放在ViewPager的上面,很随意了,你想放哪就放哪。 在Activity中的使用方式为: ViewPager mViewPager = (ViewPager) findViewById(R.id.viewpager); ColumnHorizontalScrollView title = (ColumnHorizontalScrollView) findViewById(R.id.title); mViewPager.setAdapter(new FragmentStatePagerAdapter(getSupportFragmentManager()) { @Override public int getCount() { return ; } @Override public Fragment getItem(int arg0) { return new MyFragment(arg0); } }); title.setTitle("上市的公司","历史","游戏啊","房产证","精选的搞笑片段","段子","电脑硬件","热点","轻松一刻","时尚"); //这个是设置标题的 title.setspace(); title.setViewPager(mViewPager); //这个是将ViewPager对象给自定义的View 我就把自定义的类代码贴出来吧:比较懒了,时间比较紧,代码封装的不好,也没怎么封装,见谅。public class ColumnHorizontalScrollView extends View implements OnPageChangeListener { private Context context; private int width ; private int padingLeft; private int padingRight ; private float lineStartX = 0 ; private float lineEndX = 0 ; private Paint textPaint; private int textWidth ; private int lastPosition = 0 ; private float lineScale = 0 ; private ViewPager mViewPager ; /** * 这些事默认设置的 */ private static final int DEFULT_TEXT_COLOR = Color.BLACK; private static final int DEFULT_TEXT_SIZE = ; private static final int DEFULT_LINE_COLOR = Color.RED; private static final int DEFULT_LINE_STRO = 5; private String [] str ; // 存储 题要显示的字符 private float [] strX ; // 存储 每个字符 开始的X位置 private float [] strWidth ; // 存储每个字符的长度 private int startX; // 与手势相关 记录按下的X的坐标 private int recordDownX = 0 ; private OnClickOneListener mOnClickOneListener ; private OverScroller mScroller; public ColumnHorizontalScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } public ColumnHorizontalScrollView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } public ColumnHorizontalScrollView(Context context) { super(context); init(context); } /** * 初始化的时候需要new出来的一些类,和必要的设置 * @param context */ private void init(Context context){ this.context = context ; mScroller = new OverScroller(context,new LinearInterpolator()); textPaint = new Paint(); linePaint = new Paint(); textPaint.setColor(DEFULT_TEXT_COLOR); textPaint.setTextSize(DEFULT_TEXT_SIZE); textPaint.setTypeface(Typeface.SANS_SERIF); linePaint.setColor(DEFULT_LINE_COLOR); linePaint.setStrokeWidth(DEFULT_LINE_STRO); } /** * 画图 */ @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (str == null) { return ; } measureSize(); drawText(canvas); //画字 measureLineSize();//测量下划线的位置 drawLine(canvas);//画下划线 } /** * 这个是用来通过Scroller来控制缓冲变化的 后来不需要了 */ @Override public void computeScroll() { if (mScroller.computeScrollOffset()) { scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); } super.computeScroll(); postInvalidate(); } /** * 画字的具体代码 * @param canvas */ private void drawText(Canvas canvas){ int totel = 0 ; for (int i = 0; i < str.length; i&#;&#;) { if (i == 0 ) { totel &#;= padingLeft; } strX[i] = totel ; canvas.drawText(str[i], strX[i], textHeight, textPaint); float oneTextWidth = textPaint.measureText(str[i]); totel =(int) (totel &#; oneTextWidth &#;space); strWidth[i] = oneTextWidth ; } textWidth = totel - space &#;padingLeft ; } private void drawLine(Canvas canvas){ canvas.drawLine(lineStartX, lineHeight ,lineEndX , lineHeight, linePaint); } private void measureSize(){ width = getWidth(); height = getHeight(); padingLeft = getPaddingLeft(); padingRight = getPaddingRight(); textHeight = (int) (height / 2 - (textPaint.descent() &#; textPaint.ascent())/2); lineHeight = (int) (textHeight - (textPaint.descent() &#; textPaint.ascent())); } private void measureLineSize(){ lineStartX = strX[lastPosition] - space / 2 &#; (strWidth[lastPosition] &#; space )* lineScale; if ((lastPosition &#; 1) == mViewPager.getAdapter().getCount()) { lineEndX = strX[lastPosition] &#; strWidth[lastPosition] &#; space / 2 ; }else { lineEndX = strX[lastPosition] &#; strWidth[lastPosition] &#; space / 2 &#; ( strWidth[lastPosition &#; 1] &#; space ) * lineScale; } } public void setTitle(String ...str){ this.str = str ; strX = new float[str.length]; strWidth = new float[str.length]; } private int space = 0 ; private Paint linePaint; private int lineHeight; private int height; private int textHeight; public void setspace(int space){ this.space = space ; } public void setTextColorResourceId(int colorid){ int color = context.getResources().getColor(colorid); textPaint.setColor(color); } public void setTextColor(int color){ textPaint.setColor(color); } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = recordDownX = (int) event.getX(); break; case MotionEvent.ACTION_MOVE: int moveX = (int) event.getX(); int scrollX = getScrollX(); if (Math.abs(moveX - recordDownX ) > ) { smootMove(scrollX , startX - moveX); } startX = (int) event.getX(); break; case MotionEvent.ACTION_UP: int upX = (int) event.getX(); if (Math.abs(upX - recordDownX ) < ) { int position = decidePosition(upX); setPosition(position); if (mOnClickOneListener != null) { mOnClickOneListener.onClick(position) ; } } break; } return true; } private int decidePosition(int upX){ for (int i = 0; i < strX.length; i&#;&#;) { if ((upX &#; getScrollX()) < (strX[i] &#; strWidth[i]) &#; space / 2) { return i ; } } return 0 ; } public void setPosition(int position){// lastPosition = position ;// int scrollX = getScrollX();// int location = (int) (strX[lastPosition] - space - );// int dy = (int)(location - getScrollX());// if ((location &#; width) > (textWidth &#; padingRight ) ) {// mScroller.startScroll(scrollX, 0,textWidth &#; padingRight - width - getScrollX() , 0, );// }else {// mScroller.startScroll(scrollX, 0, dy , 0, );// }// if ((scrollX &#; dy ) > (textWidth&#;padingRight - width)) {// mScroller.startScroll(scrollX, 0, textWidth&#;padingRight - width - scrollX , 0, );// }else {// mScroller.startScroll(scrollX, 0, dy , 0, );// } mViewPager.setCurrentItem(position); } private void smootMove(int scrollX , int dy){ if ((scrollX <= 0 && dy > 0 && textWidth > width) || (scrollX > 0)) { if ((scrollX &#; dy) < 0 ) { scrollTo(0 , 0); }else { if ((scrollX &#; dy &#; getWidth()) > (textWidth&#;padingRight )) { scrollTo(textWidth &#;padingRight - getWidth() , 0); }else { scrollTo(scrollX &#; dy , 0); } } } } public void setViewPager(ViewPager mViewPager){ this.mViewPager = mViewPager; if (this.mViewPager != null) { this.mViewPager.setOnPageChangeListener(this); } } /** * dip转为 px */ public int dip2px(float dipValue) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dipValue * scale &#; 0.5f); } @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int lastPosition, float scale, int location) { this.lastPosition = lastPosition ; lineScale = scale ; invalidate(); smootMove((int)(strX[lastPosition] - space - ) ,(int)((strWidth[lastPosition] &#; space )* lineScale)); } @Override public void onPageSelected(int arg0) { } public void setOnClickOneListener (OnClickOneListener mOnClickOneListener){ this.mOnClickOneListener = mOnClickOneListener ; } /** * 内部接口 是点击事件的接口 * @author lenovo * */ interface OnClickOneListener{ public void onClick(int position); } } over。关于bug:这个做的还不是很完善,还有一些东西没有做适配。如果有人用,在使用过程中出现问题,你可以自己做一下简单的适配。 源码下载地址:

推荐整理分享Android之自定义(上方标题随ViewPager手势慢慢滑动)(安卓自定义app),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:android自定义按钮,android 自定义spinner,android自定义样式,android 自定义dialog,android 自定义view三个方法,android 自定义dialog,android自定义属性详解,android 自定义,内容如对您有帮助,希望把文章链接给更多的朋友!

Android之自定义(上方标题随ViewPager手势慢慢滑动)(安卓自定义app)

我的github地址: 博客地址:

版权声明:本文为博主原创文章,未经博主允许不得转载。

自定义之仪表盘 自定义的View,实现了转盘的动画旋转,通过结合Animator实现的动画。效果图:源码下载地址:

Dom学习笔记 1.使用javascript操作dom进行dhtml开发;2.dom就是html页面的模型,将每个便签都作为一个对象,javascript通过调用dom中的属性方法就可以对网页中的文本框,

Android笔记 JavaOOPAPI(lang包,util包,io包)包装类-Integer数据库JDBC--SQLServiceWEBHtml(css,js),(JSP/Servlet)Android应用型技术游戏--暂时来说国内没什么前途,在技术上来说:图形功

标签: 安卓自定义app

本文链接地址:https://www.jiuchutong.com/biancheng/374355.html 转载请保留说明!

上一篇:Android性能优化之内存篇(Android性能优化工具)

下一篇:自定义之仪表盘(自定义仪表盘的价值)

  • 认证不过的进项税是怎么调出分录?
  • 如何开具免税发票
  • 药酒消费税计税依据
  • 小规模纳税人补税怎么补
  • 甲供材入账
  • 车船税和保险在一起怎么报销
  • 劳务派遣的开票规范
  • 工商年报最迟什么时候申报
  • 小规模纳税人申请一般纳税人流程
  • 卖自用轿车要缴什么税
  • 基金收入交增值税吗
  • 独立核算分公司注销需要清算吗
  • 供应销用商品给的返利怎么做?
  • 收到客户银行按时到账
  • 预提职工福利怎么记账
  • 售后回租有风险吗
  • 向一般纳税人销售劳保专用物品
  • 发生的成本作为存货处理
  • 房产税法律制度的重要内容
  • 民事责任行政责任刑事责任的区别
  • 案例分析互联网巨头的战略计划
  • 企业所得税月交还是年交
  • 电子票据查询打印
  • 代开增值税发票沒有付款怎么做账?
  • 股东转入实收资本
  • 生产设备投资入股增值税
  • 资本公积有哪些科目
  • 微信支付宝收款码二合一
  • 赠与合同任意撤销与法定撤销的区别
  • 个体工商户和个人商家的区别
  • 腾讯电脑管家中蓝牙在哪
  • win10电源模式最佳性能多耗好多电
  • thinkpad x230笔记本
  • appdata文件夹在用户文件夹哪里
  • PHP:Memcached::getDelayedByKey()的用法_Memcached类
  • 承租厂房需要缴纳什么税
  • 四个常见html网页乱码问题及解决办法
  • 抵债资产的账务处理
  • php如何生成html
  • php调用url
  • php redis常用命令
  • js鼠标键盘事件
  • 收到社保稳岗补贴转入营业外收入要交企业所得税吧
  • 如何在vue项目中禁止谷歌浏览器改变网页颜色
  • gparted 命令行
  • html用javascript
  • 投资性房地产公允价值模式账务处理
  • python sockets
  • 月末半成品也需要结转生产成本
  • 营业收入计入销售收入吗
  • 矿泉水发票能否抵税
  • 有形动产租赁属于经营租赁吗
  • 管理费用如何核算
  • 费用报销单如何粘贴票据
  • 网上购物退款后未退回物品怎么投诉
  • 预付货款属不属于消费信用
  • 电子发票是否是原件发票
  • sqlserver代理无法启动怎样办
  • Sql Server datetime问题
  • Mac怎么快速显示桌面
  • linux 压缩包zip
  • win10打
  • win7安装flash提示连接失败
  • win7 注册表 ahci
  • surface pro7应用
  • Win10 Mobile 10586.36在Lumia640 XL中的体验 很流畅
  • 斗西游破解版
  • Tutorial 6:Translation Transformation
  • js方法
  • listview的view属性
  • Unable to execute dex: Multiple dex files define 解决方法
  • nodejs实现登录功能
  • unity3d如何发布ios教程
  • unity常用api
  • 支付境外公司服务费需要缴纳哪些税费
  • 北京密云十里堡镇河漕社区卫生服务站
  • 河北省电子税务局官网app
  • 海珠税务局许丰
  • 外地人在秦皇岛买房
  • 审计现金盘点表怎么填
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设