可拖拽的闪亮view

原创 2015年11月20日 16:52:44

图示

闪瞎你

自定义参数

<resources>
    <declare-styleable name="MoveView">
        <attr name="oneBg" format="color" />
        <attr name="twoBg" format="color"/>
        <attr name="threeBg" format="color"/>
    </declare-styleable>
</resources>

自定义view

import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Scroller;

import com.magus.trainingfirstapp.R;

/**
 * Created by yangshuai in the 14:51 of 2015.11.20 .
 */
public class MoveView extends View {

    private int oneBg;
    private int twoBg;
    private int threeBg;
    private Paint onePaint;
    private Paint twoPaint;
    private Paint threePaint;
    RectF rectFOne;
    RectF rectFTwo;
    RectF rectFThree;
    private Scroller mScroller;

    public MoveView(Context context) {
        super(context);
        init(null, 0);
    }

    public MoveView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(attrs, 0);
    }

    public MoveView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(attrs, defStyleAttr);
    }

    private void init(AttributeSet attrs, int defStyleAttr) {
        final TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MoveView, defStyleAttr, 0);
        oneBg = typedArray.getColor(R.styleable.MoveView_oneBg, Color.BLUE);
        twoBg = typedArray.getColor(R.styleable.MoveView_twoBg, Color.YELLOW);
        threeBg = typedArray.getColor(R.styleable.MoveView_threeBg, Color.RED);
        typedArray.recycle();

        onePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        twoPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        threePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

        onePaint.setColor(oneBg);
        twoPaint.setColor(twoBg);
        threePaint.setColor(threeBg);

        mScroller = new Scroller(getContext());
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Log.d("CusstomScrollView", "onMeasure");

        /* 先对父控件进行测量 */
        int parentWidth = measerSize(widthMeasureSpec, dip2px(320));
        int parentHeight = measerSize(heightMeasureSpec, dip2px(240));
        setMeasuredDimension(parentWidth, parentHeight);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        rectFOne = new RectF(0, 0, w, h);
        rectFTwo = new RectF(w / 6, h / 6, w / 6 * 5, h / 6 * 5);
        rectFThree = new RectF(w / 6 * 2, h / 6 * 2, w / 6 * 4, h / 6 * 4);
    }

    /**
     * 测量
     *
     * @param sizeMeasureSpec
     * @param defaultSize
     * @return
     */
    private int measerSize(int sizeMeasureSpec, int defaultSize) {
        int mode = MeasureSpec.getMode(sizeMeasureSpec);
        int result = defaultSize;

        switch (mode) {

            /* 精确值模式,即给控件宽高指定明确的数值,或者match_parent */
            case MeasureSpec.EXACTLY:
                result = sizeMeasureSpec;
                break;

            /* 最大值模式,即给控件宽高属性设置为wrap_content时 */
            case MeasureSpec.AT_MOST:
                result = Math.min(result, sizeMeasureSpec);
                break;

            /* 不指定大小测量模式,view想多大就多大,通常情况下自定义view的时候才会使用 */
            case MeasureSpec.UNSPECIFIED:
                break;

        }

        return result;
    }

    /**
     * dip 转 px
     *
     * @param dip
     * @return
     */
    public final int dip2px(float dip) {
        DisplayMetrics displayMetrics = Resources.getSystem().getDisplayMetrics();
        return (int) (displayMetrics.density * dip);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        canvas.drawOval(rectFOne, onePaint);


        canvas.drawOval(rectFTwo, twoPaint);


        canvas.drawOval(rectFThree, threePaint);

        int tempBg = oneBg;
        oneBg = twoBg;
        twoBg = threeBg;
        threeBg = tempBg;

        onePaint.setColor(oneBg);
        twoPaint.setColor(twoBg);
        threePaint.setColor(threeBg);

        postInvalidateDelayed(500);
    }

    private float lastPointX;
    private float lastPointY;
    @Override
    public boolean onTouchEvent(MotionEvent event) {

        float pointX = event.getX();
        float pointY = event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if (!mScroller.isFinished()) {
                    mScroller.abortAnimation();
                }
                lastPointX = event.getX();
                lastPointY = event.getY();
                break;

            case MotionEvent.ACTION_MOVE:
                int dx = (int) (pointX - lastPointX);
                int dy = (int) (pointY - lastPointY);

                /* 使用layout方法 */
//                layout(getLeft() + dx, getTop() + dy, getRight() + dx, getBottom() + dy);

                /* 使用scrollBy方法 */
                View parent = (View) getParent();
                parent.scrollBy(-dx, -dy);
                break;

            case MotionEvent.ACTION_UP:
                View viewParent = (View) getParent();
                mScroller.startScroll(
                        viewParent.getScrollX(),
                        viewParent.getScrollY(),
                        -viewParent.getScrollX(),
                        -viewParent.getScrollY(), 3000);
                break;
        }
        return true;
    }

    /* 使用scoller */
    @Override
    public void computeScroll() {
        super.computeScroll();
        if (mScroller.computeScrollOffset()) {
            ((View) getParent()).scrollTo(
                    mScroller.getCurrX(),
                    mScroller.getCurrY());
            postInvalidate();
        }
    }
}

使用

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="fill_parent" >

    <com.magus.trainingfirstapp.view.MoveView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        />

</RelativeLayout>

源码

源码:https://github.com/Afra55/TrainingFirstApp

版权声明:原博客地址:http://blog.csdn.net/yang786654260

View的拖拽Demo

  • 2015年03月29日 15:23
  • 31KB
  • 下载

view上添加控件实现拖拽

  • 2015年07月21日 22:48
  • 16KB
  • 下载

Android手摸手实现一个画板功能(一)——View的拖拽

一、概述  从之前项目中抽取出来的一个“画板”功能模块,就是可以在一个空白布局上,添加不同的元素,实现自由组合,暂时没想到啥好名字,姑且叫它“画板”吧。   主要实现了View的拖拽、缩放、旋转、复...

IOS,view拖拽

  • 2015年06月02日 21:30
  • 430B
  • 下载

可拖拽View,仿墨迹天气城市管理

  • 2015年09月01日 14:30
  • 1.52MB
  • 下载

Android自定义View拖拽效果的设计

Android自定义View的拖拽效果的设计这里设计两个程序自定义View效果.

可拖拽View,仿墨迹天气城市管理

  • 2014年03月21日 14:46
  • 2.04MB
  • 下载

简单自定义view拖拽--桃先森

public class MyView2 extends View { private int integer; private int index; private float...
  • LiyLdbk
  • LiyLdbk
  • 2017年06月09日 11:56
  • 95

自定义可拖拽的view

自定义可拖拽的view;event.getX()与getRawX()

Android View 查看大图(支持拖拽,缩放,旋转)

嗨 大家好,我是不服不行 。 今天为大家带来一个手机界面中的这个,这个一个常客。经常被使用在图片查看之中,让我们先看看效果。 首先图片是怎么在界面上显示的呢? 很容易发现到唯一 的一个对外公开的方法s...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:可拖拽的闪亮view
举报原因:
原因补充:

(最多只允许输入30个字)