android文字滑动到标题,Android之自己定义(上方标题随ViewPager手势慢慢滑动)(示例代码)...

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 = 40;

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 

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 ) > 32 ) {

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 

if ((upX + getScrollX()) 

return i ;

}

}

return 0 ;

}

public void setPosition(int position){

//        lastPosition = position ;

//        int scrollX = getScrollX();

//        int location = (int) (strX[lastPosition] - space - 20);

//        int dy = (int)(location  - getScrollX());

//        if ((location + width) > (textWidth + padingRight ) ) {

//            mScroller.startScroll(scrollX, 0,textWidth + padingRight - width - getScrollX()  , 0, 200);

//        }else {

//            mScroller.startScroll(scrollX, 0, dy , 0, 200);

//        }

//        if ((scrollX + dy ) > (textWidth+padingRight - width)) {

//            mScroller.startScroll(scrollX, 0, textWidth+padingRight - width - scrollX , 0, 200);

//        }else {

//            mScroller.startScroll(scrollX, 0, dy , 0, 200);

//        }

mViewPager.setCurrentItem(position);

}

private void smootMove(int scrollX , int dy){

if ((scrollX <= 0 && dy > 0 && textWidth > width)  || (scrollX > 0)) {

if ((scrollX + dy) 

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 - 20 ) ,(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);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值