博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用Android的drawPath模仿易网滑动标题的源码
阅读量:6221 次
发布时间:2019-06-21

本文共 4135 字,大约阅读时间需要 13 分钟。

hot3.png

  原文是长方形滑块,经过改编之后是绘制的三角形代替长方形,使用drawPath()方法,先上效果图。

\
  BottomBar.java
  

  package aisk.bottombar;  import android.content.Context;  import android.content.res.TypedArray;  import android.graphics.Canvas;  import android.graphics.Color;  import android.graphics.Paint;  import android.graphics.Path;  import android.graphics.Rect;  import android.graphics.RectF;  import android.util.AttributeSet;  import android.util.Log;  import android.view.LayoutInflater;  import android.view.View;  import android.widget.ImageView;  import android.widget.LinearLayout;  public class BottomBar extends LinearLayout {  private int mSelectedBtn;  private ImageView mBtn1;  private ImageView mBtn2;  private ImageView mBtn3;  private ImageView mBtn4;  private Paint paint;  private Triangle curTriangle = null;  private Triangle tarTriangle = null;  public BottomBar(Context context) {  this(context, null);  }  public BottomBar(Context context, AttributeSet attrs) {  super(context, attrs);  setWillNotDraw(false);  LayoutInflater.from(context).inflate(R.layout.bottom_bar, this, true);  paint = new Paint();  paint.setAntiAlias(true);  mBtn1 = (ImageView)findViewById(R.id.btn1);  mBtn2 = (ImageView)findViewById(R.id.btn2);  mBtn3 = (ImageView)findViewById(R.id.btn3);  mBtn4 = (ImageView)findViewById(R.id.btn4);  TypedArray a = context.obtainStyledAttributes(attrs,  R.styleable.BottomBar);  mSelectedBtn = a.getInt(R.styleable.BottomBar_selected_btn, 1);  a.recycle();  View.OnClickListener clickBtn = new View.OnClickListener() {  @Override  public void onClick(View view) {  if (view == mBtn1)  mSelectedBtn = 1;  else if (view == mBtn2)  mSelectedBtn = 2;  else if (view == mBtn3)  mSelectedBtn = 3;  else if (view == mBtn4)  mSelectedBtn = 4;  //Log.d("Selected Button:", String.valueOf(mSelectedBtn));  tarTriangle.left = view.getLeft() + view.getWidth()/2 - 10;  tarTriangle.right = view.getLeft() + view.getWidth()/2 + 10;  tarTriangle.top = view.getTop() - 4;  tarTriangle.bottom = view.getTop() + 13.3f;  invalidate();  }  };  mBtn1.setOnClickListener(clickBtn);  mBtn2.setOnClickListener(clickBtn);  mBtn3.setOnClickListener(clickBtn);  mBtn4.setOnClickListener(clickBtn);  }  public void setSelectedBtn(int i) {  mSelectedBtn = i;  }  public int getSelectedBtn() {  return mSelectedBtn;  }  @Override  public void onDraw(Canvas canvas) {  super.onDraw(canvas);  //Log.d("Validated!", "Should not always validate");  int step = getWidth()/30;  canvas.drawColor(Color.BLACK);  paint.setColor(Color.LTGRAY);  paint.setStyle(Paint.Style.FILL);  if (curTriangle == null){  curTriangle = new Triangle(  mBtn1.getLeft() + mBtn1.getWidth()/2 - 10,  mBtn1.getTop() - 4,  mBtn1.getLeft() + mBtn1.getWidth()/2 + 10,  mBtn1.getTop() + 13.3f  );  }  if (tarTriangle == null){  tarTriangle = new Triangle(  mBtn1.getLeft() + mBtn1.getWidth()/2 - 10,  mBtn1.getTop() - 4,  mBtn1.getLeft() + mBtn1.getWidth()/2 + 10,  mBtn1.getTop() + 13.3f  );  }  if (Math.abs(curTriangle.left - tarTriangle.left) < step) {  curTriangle.left = tarTriangle.left;  curTriangle.right = tarTriangle.right;  curTriangle.reDraw();  }  if (curTriangle.left > tarTriangle.left){  curTriangle.left -= step;  curTriangle.right -= step;  curTriangle.reDraw();  invalidate();  }  else if (curTriangle.left < tarTriangle.left) {  curTriangle.left += step;  curTriangle.right += step;  curTriangle.reDraw();  invalidate();  }  canvas.drawPath(curTriangle.getPath(), paint);  }  }  
  Triangle.java   
  
package aisk.bottombar;  
  简单说明一下:   1.原理,其实很简单,curTriangle记录当前三角位置,tarTriangle记录目的三角位置,在BottomBar的onDraw()方法中监测两个位置,当发现curTriangle和tarTriangle不一致时,就移动屏幕大小的1/30   
  int step = getWidth()/30;  
  逐渐移动至tarTriangle。   2.三角的绘制方法是使用的Path()绘制   
    mPath = new Path();  mPath.moveTo(left, top);  mPath.lineTo(right, top);  mPath.lineTo((left + right)/2, bottom);  mPath.close();  
  3.发现位置改变时要重新绘制三角   
    mPath.reset();  mPath.moveTo(left, top);  mPath.lineTo(right, top);  mPath.lineTo((left + right)/2, bottom);  mPath.close();  
  注:此文件需要全部现在才可以应用
23015109_Sodz.jpg
23015109_Sodz.jpg

转载:http://www.adobex.com/android/source/details/00000172.htm

转载于:https://my.oschina.net/androidcode/blog/103900

你可能感兴趣的文章
Unity CullingMask
查看>>
利用https访问web站点
查看>>
d3数值转换与时间转换
查看>>
基础运维:详细系统文件目录说明
查看>>
易宝典文章——玩转Office 365中的Exchange Online服务 之六 了解Exchange Online对于邮箱使用的限制...
查看>>
Oracle Database常见存储用语Terms
查看>>
centos linux java安装
查看>>
【数据恢复】详解ORA-8103错误
查看>>
Windows Docker和Windows Nano Server来啦!
查看>>
oracle数据字典
查看>>
自动统计机器硬件信息插入数据库
查看>>
我的友情链接
查看>>
Apache日志分析 shell短语
查看>>
大型网站系统架构的演化
查看>>
Nginx 中last和break 及 permanent 和 redirect 的爱恨情仇
查看>>
致歉!《迟来的观后感》一文存在问题!
查看>>
mysql 安全
查看>>
【Transact-SQL】SQL Server自动把left join自动转化为inner join、以及关联时的数据重复问题...
查看>>
Options for mounting NFS filesystem
查看>>
Linux学习-第四节课
查看>>