功能炫酷的大转盘

两个自定义控件

第一个LuckPanLayout

package com.hr.nipuream.luckpan.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;

import com.hr.nipuream.luckpan.util.Logger;
import com.hr.nipuream.luckpan.util.Util;


public class LuckPanLayout extends RelativeLayout {

    private Context context;
    private Paint backgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Paint whitePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Paint yellowPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private int radius;
    private int CircleX,CircleY;
    private Canvas canvas;
    private boolean isYellow = false;
    private int delayTime = 500;
    private RotatePan rotatePan;
    private ImageView startBtn;

    private int screenWidth,screeHeight;
    private int MinValue;
    /**
     * LuckPan 中间对应的Button必须设置tag为 startbtn.
     */
    private static final String START_BTN_TAG = "startbtn";
    public static final int DEFAULT_TIME_PERIOD = 500;


    public LuckPanLayout(Context context) {
        this(context,null);
    }

    public LuckPanLayout(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public LuckPanLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
        Logger.setDebug(true);
        backgroundPaint.setColor(Color.rgb(255,92,93));
        whitePaint.setColor(Color.WHITE);
        yellowPaint.setColor(Color.YELLOW);
        screeHeight = getResources().getDisplayMetrics().heightPixels;
        screenWidth = getResources().getDisplayMetrics().widthPixels;
        startLuckLight();
    }



    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        MinValue = Math.min(screenWidth,screeHeight);
        MinValue -= Util.dip2px(context,10)*2;
        Logger.getLogger().d("screenWidth = "+screenWidth + "screenHeight = "+screeHeight + "MinValue = "+MinValue);
        setMeasuredDimension(MinValue,MinValue);
    }


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

        final int paddingLeft = getPaddingLeft();
        final int paddingRight = getPaddingRight();
        final int paddingTop = getPaddingTop();
        final int paddingBottom = getPaddingBottom();

        int width = getWidth() - paddingLeft - paddingRight;
        int height = getHeight() - paddingTop - paddingBottom;

        int MinValue = Math.min(width,height);

        radius = MinValue /2;
        CircleX = getWidth() /2;
        CircleY = getHeight() /2;

        canvas.drawCircle(CircleX,CircleY,radius,backgroundPaint);

        drawSmallCircle(isYellow);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        int centerX = (right - left)/2;
        int centerY = (bottom - top)/2;
        boolean panReady = false;
        for(int i=0;i<getChildCount();i++){
            View child = getChildAt(i);
            if(child instanceof RotatePan){
                rotatePan = (RotatePan) child;
                 int panWidth = child.getWidth();
                 int panHeight = child.getHeight();
                 child.layout(centerX - panWidth/2 , centerY - panHeight/2,centerX + panWidth/2 , centerY + panHeight/2);
                 panReady = true;
            }else if(child instanceof ImageView){
                if(TextUtils.equals((String) child.getTag(),START_BTN_TAG)){
                    startBtn = (ImageView) child;
                    int btnWidth = child.getWidth();
                    int btnHeight = child.getHeight();
                    child.layout(centerX - btnWidth/2 , centerY - btnHeight/2 , centerX + btnWidth/2, centerY + btnHeight/2 );
                }
            }
        }

        if(!panReady) throw new RuntimeException("Have you add RotatePan in LuckPanLayout element ?");
    }

    private void drawSmallCircle(boolean FirstYellow){
        int pointDistance = radius - Util.dip2px(context,10);
        for(int i=0;i<=360;i+=20){
            int x = (int) (pointDistance * Math.sin(Util.change(i))) + CircleX;
            int y = (int) (pointDistance * Math.cos(Util.change(i))) + CircleY;

            if(FirstYellow)
                canvas.drawCircle(x,y,Util.dip2px(context,4),yellowPaint);
            else
                canvas.drawCircle(x,y,Util.dip2px(context,4),whitePaint);
            FirstYellow = !FirstYellow;
        }
    }


    /**
     * 开始旋转
     * @param pos  转到指定的转盘,-1 则随机
     * @param delayTime  外围灯光闪烁的间隔时间
     */
    public void rotate(int pos,int delayTime){
        rotatePan.startRotate(pos);
        setDelayTime(delayTime);
        setStartBtnEnable(false);
    }

    protected void setStartBtnEnable(boolean enable){
        if(startBtn != null)
            startBtn.setEnabled(enable);
        else throw new RuntimeException("Have you add start button in LuckPanLayout element ?");
    }

    private void startLuckLight(){
        postDelayed(new Runnable() {
            @Override
            public void run() {
                isYellow = !isYellow;
                invalidate();
                postDelayed(this,delayTime);
            }
        },delayTime);
    }


    protected void setDelayTime(int delayTime){
        this.delayTime = delayTime;
    }

    public interface AnimationEndListener{
        void endAnimation(int position);
    }

    private AnimationEndListener l;

    public void setAnimationEndListener(AnimationEndListener l){
        this.l = l;
    }

    public AnimationEndListener getAnimationEndListener(){
        return l;
    }

}

第二个自定义控件RotatePan

package com.hr.nipuream.luckpan.view;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.ScrollerCompat;
import android.util.AttributeSet;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import com.hr.nipuream.luckpan.R;
import com.hr.nipuream.luckpan.util.Logger;
import com.hr.nipuream.luckpan.util.Util;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class RotatePan extends View {

    private Context context;

    private int panNum = 0;

    private Paint dPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Paint sPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private int InitAngle = 0;
    private int radius = 0;
    private int verPanRadius ;
    private int diffRadius ;
    public static final int FLING_VELOCITY_DOWNSCALE = 4;
    private Integer[] images ;
    private String[] strs ;
    private List<Bitmap> bitmaps = new ArrayList<>();
    private GestureDetectorCompat mDetector;
    private ScrollerCompat scroller;
    private int screenWidth,screeHeight;

    //旋转一圈所需要的时间
    private static final long ONE_WHEEL_TIME = 500;

    public RotatePan(Context context) {
        this(context,null);
    }

    public RotatePan(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public RotatePan(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        this.context = context;
        screeHeight = getResources().getDisplayMetrics().heightPixels;
        screenWidth = getResources().getDisplayMetrics().widthPixels;

        mDetector = new GestureDetectorCompat(context,new RotatePanGestureListener());
        scroller = ScrollerCompat.create(context);

        checkPanState(context,attrs);
        InitAngle = 360 / panNum;
        verPanRadius = 360 / panNum;
        diffRadius = verPanRadius /2;
        dPaint.setColor(Color.rgb(255,133,132));
        sPaint.setColor(Color.rgb(254,104,105));
        textPaint.setColor(Color.WHITE);
        textPaint.setTextSize(Util.dip2px(context,16));
        setClickable(true);

        for(int i=0;i<panNum;i++){
            Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), images[i]);
            bitmaps.add(bitmap);
        }
    }

    private void checkPanState(Context context,AttributeSet attrs){
        Logger.getLogger().d("start load luckpan resources ...");
        TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.luckpan);
        panNum = typedArray.getInteger(R.styleable.luckpan_pannum,0);
        if(360 % panNum != 0)
            throw new RuntimeException("can't split pan for all icon.");
        int nameArray = typedArray.getResourceId(R.styleable.luckpan_names,-1);
        if(nameArray ==  -1) throw new RuntimeException("Can't find pan name.");
        strs = context.getResources().getStringArray(nameArray);
        int iconArray = typedArray.getResourceId(R.styleable.luckpan_icons, -1);
        if(iconArray == -1) throw  new RuntimeException("Can't find pan icon.");

        String[] iconStrs = context.getResources().getStringArray(iconArray);
        List<Integer> iconLists =  new ArrayList<>();
        for(int i=0;i<iconStrs.length;i++){
            iconLists.add(context.getResources().getIdentifier(iconStrs[i],"mipmap",context.getPackageName()));
        }

        images = iconLists.toArray(new Integer[iconLists.size()]);
        Logger.getLogger().d(Arrays.toString(images));
        typedArray.recycle();
        if(strs == null || images == null)
            throw new RuntimeException("Can't find string or icon resources.");
        if(strs.length != panNum || images.length != panNum)
            throw new RuntimeException("The string length or icon length  isn't equals panNum.");
        Logger.getLogger().d("load luckpan resources successfully -_- ~");
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        // TODO Auto-generated method stub
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int MinValue = Math.min(screenWidth,screeHeight);
        MinValue -= Util.dip2px(context,38)*2;
        setMeasuredDimension(MinValue,MinValue);
    }

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

        final int paddingLeft = getPaddingLeft();
        final int paddingRight = getPaddingRight();
        final int paddingTop = getPaddingTop();
        final int paddingBottom = getPaddingBottom();

        int width = getWidth() - paddingLeft - paddingRight;
        int height = getHeight() - paddingTop - paddingBottom;

        int MinValue = Math.min(width,height);

        radius = MinValue/2;

        RectF rectF = new RectF(getPaddingLeft(),getPaddingTop(),width,height);

        int angle = (panNum%4 ==0) ? InitAngle : InitAngle-diffRadius;
        Logger.getLogger().d(String.valueOf(angle));

        for(int i= 0;i<panNum;i++){
            if(i%2 == 0){
                canvas.drawArc(rectF,angle,verPanRadius,true,dPaint);
            }else
            {
                canvas.drawArc(rectF,angle,verPanRadius,true,sPaint);
            }
            angle += verPanRadius;
        }

        for(int i=0;i<panNum;i++){
            drawIcon(width/2, height/2, radius, (panNum%4==0)?InitAngle + diffRadius : InitAngle, i, canvas);
            InitAngle += verPanRadius;
        }

        for(int i=0;i<panNum;i++){
            drawText((panNum%4==0)?InitAngle+diffRadius + (diffRadius*3/4):InitAngle+diffRadius ,strs[i], 2*radius, textPaint, canvas,rectF);
            InitAngle += verPanRadius;
        }
    }

    private void drawText(float startAngle, String string,int mRadius,Paint mTextPaint,Canvas mCanvas,RectF mRange)
    {
        Path path = new Path();

        path.addArc(mRange, startAngle, verPanRadius);
        float textWidth = mTextPaint.measureText(string);

        //圆弧的水平偏移
        float hOffset  = (panNum % 4 == 0)?((float) (mRadius * Math.PI / panNum/2 ))
                :((float) (mRadius * Math.PI / panNum/2 - textWidth/2 ));
        //圆弧的垂直偏移
        float vOffset = mRadius / 2 / 6;

        mCanvas.drawTextOnPath(string, path, hOffset, vOffset, mTextPaint);
    }

    private void drawIcon(int xx,int yy,int mRadius,float startAngle, int i,Canvas mCanvas)
    {

        int imgWidth = mRadius / 4;

        float angle = (float) Math.toRadians(verPanRadius +startAngle);

        //确定图片在圆弧中 中心点的位置
        float x = (float) (xx + (mRadius /2 + mRadius/12)* Math.cos(angle));
        float y = (float) (yy + (mRadius /2 +mRadius/12) * Math.sin(angle));

        // 确定绘制图片的位置
        RectF rect = new RectF(x - imgWidth *2/ 3, y - imgWidth*2 / 3, x + imgWidth
                *2/ 3, y + imgWidth*2/3);

        Bitmap bitmap = bitmaps.get(i);

        mCanvas.drawBitmap(bitmap, null, rect, null);
    }


    public void setImages(List<Bitmap> bitmaps){
        this.bitmaps = bitmaps;
        this.invalidate();
    }

    public void setStr(String... strs){
        this.strs = strs;
        this.invalidate();
    }



    /**
     * 开始转动
     * @param pos 如果 pos = -1 则随机,如果指定某个值,则转到某个指定区域
     */
    protected void startRotate(int pos){

        //Rotate lap.
        int lap = (int) (Math.random()*12) + 4;

        //Rotate angle.
        int angle = 0;
        if(pos < 0){
            angle = (int) (Math.random() * 360);
        }else{
            int initPos  = queryPosition();
            if(pos > initPos){
                angle = (pos - initPos)*verPanRadius;
                lap -= 1;
                angle = 360 - angle;
            }else if(pos < initPos){
                angle = (initPos - pos)*verPanRadius;
            }else{
                //nothing to do.
            }
        }

        //All of the rotate angle.
        int increaseDegree = lap * 360 + angle;
        long time = (lap + angle / 360) * ONE_WHEEL_TIME;
        int DesRotate = increaseDegree + InitAngle;

        //TODO 为了每次都能旋转到转盘的中间位置
        int offRotate = DesRotate % 360 % verPanRadius;
        DesRotate -= offRotate;
        DesRotate += diffRadius;

        ValueAnimator animtor = ValueAnimator.ofInt(InitAngle,DesRotate);
        animtor.setInterpolator(new AccelerateDecelerateInterpolator());
        animtor.setDuration(time);
        animtor.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int updateValue = (int) animation.getAnimatedValue();
                InitAngle = (updateValue % 360 + 360) % 360;
                ViewCompat.postInvalidateOnAnimation(RotatePan.this);
            }
        });

        animtor.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                if(((LuckPanLayout)getParent()).getAnimationEndListener()!= null)
                {
                    ((LuckPanLayout)getParent()).setStartBtnEnable(true);
                    ((LuckPanLayout)getParent()).setDelayTime(LuckPanLayout.DEFAULT_TIME_PERIOD);
                    ((LuckPanLayout)getParent()).getAnimationEndListener().endAnimation(queryPosition());
                }
            }
        });
        animtor.start();
    }


    private int queryPosition(){
        InitAngle = (InitAngle % 360 + 360) % 360;
        int pos = InitAngle / verPanRadius;
        if(panNum == 4) pos ++;
        return calcumAngle(pos);
    }

    private int calcumAngle(int pos){
        if(pos >= 0 && pos <= panNum/2){
            pos = panNum/2 - pos;
        }else{
            pos = (panNum-pos) + panNum/2;
        }
        return pos;
    }



    @Override
    protected void onDetachedFromWindow() {
        clearAnimation();
        if(getParent() instanceof LuckPanLayout){
            ((LuckPanLayout) getParent()).getHandler().removeCallbacksAndMessages(null);
        }
        super.onDetachedFromWindow();
    }


    // TODO ==================================== 手势处理 ===============================================================

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        boolean consume = mDetector.onTouchEvent(event);
        if(consume)
        {
            getParent().getParent().requestDisallowInterceptTouchEvent(true);
            return true;
        }

        return super.onTouchEvent(event);
    }


    public void setRotate(int rotation){
        rotation = (rotation % 360 + 360) % 360;
        InitAngle = rotation;
        ViewCompat.postInvalidateOnAnimation(this);
    }


    @Override
    public void computeScroll() {

        if(scroller.computeScrollOffset()){
            setRotate(scroller.getCurrY());
        }

        super.computeScroll();
    }

    private class RotatePanGestureListener extends GestureDetector.SimpleOnGestureListener{

        @Override
        public boolean onDown(MotionEvent e) {
            return super.onDown(e);
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            return false;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            float centerX = (RotatePan.this.getLeft() + RotatePan.this.getRight())*0.5f;
            float centerY = (RotatePan.this.getTop() + RotatePan.this.getBottom())*0.5f;

            float scrollTheta = vectorToScalarScroll(distanceX, distanceY, e2.getX() - centerX, e2.getY() -
                    centerY);
            int rotate = InitAngle -
                    (int) scrollTheta / FLING_VELOCITY_DOWNSCALE;

            setRotate(rotate);
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            float centerX = (RotatePan.this.getLeft() + RotatePan.this.getRight())*0.5f;
            float centerY = (RotatePan.this.getTop() + RotatePan.this.getBottom())*0.5f;

            float scrollTheta = vectorToScalarScroll(velocityX, velocityY, e2.getX() - centerX, e2.getY() -
                    centerY);

            scroller.abortAnimation();
            scroller.fling(0, InitAngle , 0, (int) scrollTheta / FLING_VELOCITY_DOWNSCALE,
                    0, 0, Integer.MIN_VALUE, Integer.MAX_VALUE);
            return true;
        }
    }

    //TODO 判断滑动的方向
    private float vectorToScalarScroll(float dx, float dy, float x, float y) {

        float l = (float) Math.sqrt(dx * dx + dy * dy);

        float crossX = -y;
        float crossY = x;

        float dot = (crossX * dx + crossY * dy);
        float sign = Math.signum(dot);

        return l * sign;
    }



}

一个Util

package com.hr.nipuream.luckpan.util;

import android.content.Context;


public class Util {


    public static int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

    public static int sp2px(Context context, float spValue) {
        final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
        return (int) (spValue * fontScale + 0.5f);
    }

    public static double change(double a){
        return a * Math.PI  / 180;
    }

    public static double changeAngle(double a){
        return a * 180 / Math.PI;
    }

}

一个Logger

package com.hr.nipuream.luckpan.util;

import android.util.Log;

public class Logger {

	/**
	 * log tag
	 */
	private String tag = "LuckPan";// application name

	//TODO 配置Log打开或关闭
	/**
	 * debug or not
	 */
	private static boolean debug = true;

	private static Logger instance = new Logger();

	private Logger() {

	}

	public static Logger getLogger() {
		return instance;
	}

	private String getFunctionName() {
		StackTraceElement[] sts = Thread.currentThread().getStackTrace();

		if (sts == null) {
			return null;
		}

		for (StackTraceElement st : sts) {
			if (st.isNativeMethod()) {
				continue;
			}

			if (st.getClassName().equals(Thread.class.getName())) {
				continue;
			}

			if (st.getClassName().equals(this.getClass().getName())) {
				continue;
			}

			return "[" + Thread.currentThread().getName() + "(" + Thread.currentThread().getId() + "): " + st.getFileName() + ":" + st.getLineNumber() + "]";
		}

		return null;
	}

	private String createMessage(String msg) {
		String functionName = getFunctionName();
		String message = (functionName == null ? msg : (functionName + " - " + msg));
		return message;
	}

	/**
	 * log.i
	 */
	public void i(String msg) {
		if (debug) {
			String message = createMessage(msg);
			Log.i(tag, message);
		}
	}

	/**
	 * log.v
	 */
	public void v(String msg) {
		if (debug) {
			String message = createMessage(msg);
			Log.v(tag, message);
		}
	}

	/**
	 * log.d
	 */
	public void d(String msg) {
		if (debug) {
			String message = createMessage(msg);
			Log.d(tag, message);
		}
	}

	/**
	 * log.e
	 */
	public void e(String msg) {
//		if (debug) {
			String message = createMessage(msg);
			Log.e(tag, message);
//		}
	}

	/**
	 * log.error
	 */
	public void error(Exception e) {
		if (debug) {
			StringBuffer sb = new StringBuffer();
			String name = getFunctionName();
			StackTraceElement[] sts = e.getStackTrace();

			if (name != null) {
				sb.append(name + " - " + e + "\r\n");
			} else {
				sb.append(e + "\r\n");
			}
			if (sts != null && sts.length > 0) {
				for (StackTraceElement st : sts) {
					if (st != null) {
						sb.append("[ " + st.getFileName() + ":" + st.getLineNumber() + " ]\r\n");
					}
				}
			}
			
			Log.e(tag, sb.toString());
		}
	}

	/**
	 * log.d
	 */
	public void w(String msg) {
		if (debug) {
			String message = createMessage(msg);
			Log.w(tag, message);
		}
	}

	public void setTag(String tag) {
		this.tag = tag;
	}

	/**
	 * set debug
	 */
	public static void setDebug(boolean d) {
		debug = d;
	}
	
	public static boolean isDebug(){
		return debug;
	}
}

布局文件

<?xml version="1.0" encoding="utf-8"?>
<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:luckpan="http://schemas.android.com/apk/res-auto"
    tools:context="com.hr.nipuream.luckpan.MainActivity"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="none"
    android:background="#7CD8E3"
    >
<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >


    <!--<com.hr.nipuream.luckpan.view.EnvironmentLayout-->
        <!--android:id="@+id/evironmentLayout"-->
        <!--android:layout_width="match_parent"-->
        <!--android:layout_height="match_parent"-->
        <!--/>-->



    <!--<ImageView-->
        <!--android:id="@+id/imageview"-->
        <!--android:layout_width="wrap_content"-->
        <!--android:layout_height="wrap_content"-->
        <!--android:src="@mipmap/ic_launcher"-->
        <!--android:layout_centerInParent="true"-->
        <!--/>-->


    <!--<ImageView-->
        <!--android:layout_width="match_parent"-->
        <!--android:layout_height="match_parent"-->
        <!--android:src="@mipmap/background"-->
        <!--android:scaleType="fitXY"-->
        <!--/>-->

    <ImageView
        android:id="@+id/shan"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@mipmap/shan"
        android:scaleType="fitXY"
        android:layout_alignParentBottom="true"
        />

    <ImageView
        android:id="@+id/yun"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:src="@mipmap/yun"
        android:scaleType="fitXY"
        />

    <com.hr.nipuream.luckpan.view.LuckPanLayout
        android:id="@+id/luckpan_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:layout_centerHorizontal="true"
        android:background="@android:color/transparent"
        >

        <com.hr.nipuream.luckpan.view.RotatePan
            android:id="@+id/rotatePan"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            luckpan:pannum="8"
            luckpan:names="@array/names"
            luckpan:icons="@array/icons"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true" />

        <ImageView
            android:id="@+id/go"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@mipmap/node"
            android:clickable="true"
            android:onClick="rotation"
            android:tag="startbtn"
            />



    </com.hr.nipuream.luckpan.view.LuckPanLayout>



    <!--<Button-->
        <!--android:layout_width="wrap_content"-->
        <!--android:layout_height="wrap_content"-->
        <!--android:text="旋转"-->
        <!--android:onClick="rotation"-->
        <!--/>-->




    <RelativeLayout
        android:id="@+id/hit_user"
        android:layout_below="@+id/luckpan_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="20dp"
        >

        <TextView
            android:id="@+id/hit_user_tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@drawable/text_background"
            android:text="2016-08-18 14:30:30 马蓉 iPhone6s puls  2016-08-14 15:41:28 王宝强 macbook 2016-08-18 16:22:45 宋吉吉 魅族手机"
            android:padding="10dp"
            android:layout_centerVertical="true"
            android:gravity="center"
            android:singleLine="true"
            android:ellipsize="marquee"
            android:marqueeRepeatLimit="marquee_forever"
            android:layout_marginTop="20dp"
            android:layout_marginLeft="10dp"
            android:focusable="true"
            android:focusableInTouchMode="true"
            >
            <requestFocus/>
            </TextView>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="中奖名单"
            android:textColor="#ffffff"
            android:background="@drawable/hit_backgroud"
            android:padding="3dp"
            android:layout_alignTop="@+id/hit_user_tv"
            android:layout_centerVertical="true"
            />
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/game_rule"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="20dp"
        android:layout_marginRight="20dp"
        android:layout_marginTop="20dp"
        android:layout_below="@+id/hit_user"
        >

        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="@drawable/text_background"
            android:orientation="vertical"
            android:layout_marginLeft="10dp"
            >

            <View
                android:layout_width="wrap_content"
                android:layout_height="30dp"/>

            <TextView
                android:layout_below="@+id/huodong_rule"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="1.点击页面抢购按钮,进入抽奖流程,按提示操作即可(参与本活动无需支付任何费用)。\n2.本次活动萝莉“范儿”\御姐“范儿”\宅男“奢侈”各产生一名中奖者(每个0元抢购产品没人只可参与一次)。\n3.活动期间,每个手机号,获得的“劵号”后7位数字作为本次活动的“抽奖号”。"
                android:padding="10dp"
                />


        </LinearLayout>


        <TextView
            android:id="@+id/huodong_rule"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="活动规则"
            android:background="@drawable/rule_background"
            android:padding="5dp"
            android:textColor="#ffffff"
            android:layout_marginTop="5dp"
            />

    </RelativeLayout>
    
    <View
        android:layout_width="wrap_content"
        android:layout_height="50dp"
        android:layout_below="@+id/game_rule"
        android:layout_marginBottom="80dp"
        />
    


</RelativeLayout>
</ScrollView>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值