码迷,mamicode.com
首页 > 其他好文 > 详细

自定义视图之----模仿酷狗音乐滑动关闭闭

时间:2015-08-02 16:57:58      阅读:163      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

package com.gxa.custom;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;

public class Customtoggle extends View implements OnClickListener,OnTouchListener
{
    private Paint paint;
    private Bitmap backBitmap,slideBitmap;
    private float slideLeft,slideMax;    //slideLeft:slideBitmap左侧的位置,slideMax:slideBitmap滑动的最大距离
    private boolean isOpen;//开关的状态
    private boolean isDrag;//是否滑动
    public Customtoggle(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
    public Customtoggle(Context context) {
        this(context,null);
    }
    public Customtoggle(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(backBitmap.getWidth(), backBitmap.getHeight());
    }
    private void init() {
        paint = new Paint();
        paint.setAntiAlias(true);
        backBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.togglebutton_background);
        slideBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.togglebutton_slide);
        slideMax = backBitmap.getWidth()-slideBitmap.getWidth();
        setOnClickListener(this);
        setOnTouchListener(this);
    }
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawBitmap(backBitmap, 0, 0, paint);
        canvas.drawBitmap(slideBitmap, slideLeft, 0, paint);
    }
    
    /**
     * ontouch  返回值的问题
     * true  当前的触摸事件被消耗  
     * false  当前的触摸事件没有被消耗   分发出去了  activity  ontouchevent 
     */
    private float firstX;   //触摸的初始点
    private float preX;//上一次触摸的坐标
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            isDrag = false;
            firstX = event.getX();
            preX = firstX;
            break;

        case MotionEvent.ACTION_MOVE:
            if (Math.abs(event.getX()-firstX)>5) {
                isDrag = true;
            }
            float distance = event.getX() - preX;  //滑动的距离
            slideLeft+=distance;
            preX = event.getX();
            flushView();
            break;
        case MotionEvent.ACTION_UP:
            if (isDrag) {
                if (slideLeft>slideMax/2) {
                    isOpen = true;
                }else{
                    isOpen = false;
                }
                flushStatus();
            }
            break;
        }
        return false;
    }
    private void flushStatus() {
        if (isOpen) {
            slideLeft = slideMax;
        }else{
            slideLeft = 0;
        }
        invalidate();
    }
    private void flushView() {
        slideLeft = (slideLeft>=0)?slideLeft:0;
        slideLeft = (slideLeft<=slideMax)?slideLeft:slideMax;
        invalidate();
    }
    @Override
    public void onClick(View v) {
        if (!isDrag) {
            isOpen = !isOpen;
            flushStatus();
        }
    }
}

技术分享

技术分享


自定义视图之----模仿酷狗音乐滑动关闭闭

标签:

原文地址:http://my.oschina.net/u/2282721/blog/486656

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!