两个自定义控件
第一个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>