雷达扫描动画GIF 用自定义View实现
This commit is contained in:
168
app/src/main/java/com/gh/common/view/RadarView.java
Normal file
168
app/src/main/java/com/gh/common/view/RadarView.java
Normal file
@ -0,0 +1,168 @@
|
||||
package com.gh.common.view;
|
||||
|
||||
import android.content.Context;
|
||||
import android.graphics.Bitmap;
|
||||
import android.graphics.BitmapFactory;
|
||||
import android.graphics.Canvas;
|
||||
import android.graphics.Color;
|
||||
import android.graphics.Paint;
|
||||
import android.util.AttributeSet;
|
||||
import android.view.View;
|
||||
|
||||
import com.gh.gamecenter.R;
|
||||
|
||||
/**
|
||||
* Created by khy on 22/06/17.
|
||||
*
|
||||
* 光环快传-扫描雷达动画
|
||||
*/
|
||||
|
||||
public class RadarView extends View {
|
||||
|
||||
private Context mContext;
|
||||
private boolean isSearching = false;// 标识是否处于扫描状态,默认为不在扫描状态
|
||||
private Paint mPaint;// 画笔
|
||||
private Bitmap mScanBmp;// 执行扫描运动的图片
|
||||
private int mOffsetArgs = 0;// 扫描运动偏移量参数
|
||||
private int mWidth, mHeight;// 宽高
|
||||
int mCx, mCy;// x、y轴中心点
|
||||
int mOutsideRadius, mInsideRadius;// 外、内圆半径
|
||||
|
||||
public RadarView(Context context, AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
// TODO Auto-generated constructor stub
|
||||
init(context);
|
||||
}
|
||||
|
||||
public RadarView(Context context, AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
// TODO Auto-generated constructor stub
|
||||
init(context);
|
||||
}
|
||||
|
||||
public RadarView(Context context) {
|
||||
super(context);
|
||||
// TODO Auto-generated constructor stub
|
||||
init(context);
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO<提前初始化好需要使用的对象,避免在绘制过程中多次初始化>
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private void init(Context context) {
|
||||
mPaint = new Paint();
|
||||
this.mContext = context;
|
||||
}
|
||||
|
||||
/**
|
||||
* 测量视图及其内容,以确定所测量的宽度和高度(测量获取控件尺寸).
|
||||
*/
|
||||
@Override
|
||||
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
|
||||
// TODO Auto-generated method stub
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
|
||||
|
||||
// 获取控件区域宽高
|
||||
if (mWidth == 0 || mHeight == 0) {
|
||||
final int minimumWidth = getSuggestedMinimumWidth();
|
||||
final int minimumHeight = getSuggestedMinimumHeight();
|
||||
mWidth = resolveMeasured(widthMeasureSpec, minimumWidth);
|
||||
mHeight = resolveMeasured(heightMeasureSpec, minimumHeight);
|
||||
mScanBmp = Bitmap.createScaledBitmap(BitmapFactory.decodeResource(
|
||||
mContext.getResources(), R.drawable.radar_scan_img), mWidth, mWidth, false);
|
||||
|
||||
// 获取x/y轴中心点
|
||||
mCx = mWidth / 2;
|
||||
mCy = mHeight / 2;
|
||||
|
||||
// 计算内、外半径
|
||||
mOutsideRadius = mWidth / 2;// 外圆的半径
|
||||
mInsideRadius = mWidth / 4 / 2;// 内圆的半径,除最外层,其它圆的半径=层数*insideRadius
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 绘制视图--从外部向内部绘制
|
||||
*/
|
||||
@Override
|
||||
protected void onDraw(Canvas canvas) {
|
||||
// TODO Auto-generated method stub
|
||||
super.onDraw(canvas);
|
||||
// 开始绘制最外层的圆
|
||||
mPaint.setAntiAlias(true);// 设置抗锯齿
|
||||
mPaint.setStyle(Paint.Style.FILL);// 设置填充样式
|
||||
mPaint.setColor(0xff327BD7);// 设置画笔颜色
|
||||
// 1.开始绘制圆形
|
||||
canvas.drawCircle(mCx, mCy, mOutsideRadius, mPaint);
|
||||
|
||||
// 开始绘制内3圆
|
||||
mPaint.setStyle(Paint.Style.STROKE);
|
||||
mPaint.setColor(Color.WHITE);
|
||||
canvas.drawCircle(mCx, mCy, mInsideRadius * 3, mPaint);
|
||||
|
||||
// 开始绘制内2圆
|
||||
canvas.drawCircle(mCx, mCy, mInsideRadius * 2, mPaint);
|
||||
|
||||
// 开始绘制内1圆
|
||||
canvas.drawCircle(mCx, mCy, mInsideRadius * 1, mPaint);
|
||||
|
||||
// 2.开始绘制对角线
|
||||
canvas.drawLine(0, mCy, mWidth, mCy, mPaint);// 绘制0°~180°对角线
|
||||
canvas.drawLine(mCx, mHeight , mCx, 0,
|
||||
mPaint);// 绘制90°~270°对角线
|
||||
|
||||
// 3.绘制扫描扇形图
|
||||
canvas.save();// 用来保存Canvas的状态.save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作.
|
||||
|
||||
if (isSearching) {// 判断是否处于扫描
|
||||
canvas.rotate(mOffsetArgs, mCx, mCy);// 绘制旋转角度,参数一:角度;参数二:x中心;参数三:y中心.
|
||||
canvas.drawBitmap(mScanBmp, mCx - mScanBmp.getWidth() / 2, mCy
|
||||
- mScanBmp.getHeight() / 2, null);// 绘制Bitmap扫描图片效果
|
||||
mOffsetArgs += 3;
|
||||
} else {
|
||||
canvas.drawBitmap(mScanBmp, mCx - mScanBmp.getWidth() / 2, mCy
|
||||
- mScanBmp.getHeight() / 2, null);
|
||||
}
|
||||
|
||||
mPaint.setStyle(Paint.Style.FILL);
|
||||
mPaint.setColor(Color.WHITE);
|
||||
canvas.drawCircle(mCx, mCy, mInsideRadius/4, mPaint);
|
||||
|
||||
if (isSearching)
|
||||
this.invalidate();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO<设置扫描状态>
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public void setSearching(boolean status) {
|
||||
this.isSearching = status;
|
||||
this.invalidate();
|
||||
}
|
||||
|
||||
/**
|
||||
* TODO<解析获取控件宽高>
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
private int resolveMeasured(int measureSpec, int desired) {
|
||||
int result = 0;
|
||||
int specSize = MeasureSpec.getSize(measureSpec);
|
||||
switch (MeasureSpec.getMode(measureSpec)) {
|
||||
case MeasureSpec.UNSPECIFIED:
|
||||
result = desired;
|
||||
break;
|
||||
case MeasureSpec.AT_MOST:
|
||||
result = Math.min(specSize, desired);
|
||||
break;
|
||||
case MeasureSpec.EXACTLY:
|
||||
default:
|
||||
result = specSize;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
@ -26,8 +26,6 @@ import android.widget.LinearLayout;
|
||||
import android.widget.RelativeLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import com.facebook.drawee.backends.pipeline.Fresco;
|
||||
import com.facebook.drawee.interfaces.DraweeController;
|
||||
import com.facebook.drawee.view.SimpleDraweeView;
|
||||
import com.gh.base.AppController;
|
||||
import com.gh.base.BaseActivity;
|
||||
@ -36,6 +34,7 @@ import com.gh.common.util.DialogUtils;
|
||||
import com.gh.common.util.DisplayUtils;
|
||||
import com.gh.common.util.UserIconUtils;
|
||||
import com.gh.common.util.Utils;
|
||||
import com.gh.common.view.RadarView;
|
||||
import com.gh.gamecenter.kuaichuan.BaseTransfer;
|
||||
import com.gh.gamecenter.kuaichuan.Constant;
|
||||
import com.gh.gamecenter.kuaichuan.FileInfo;
|
||||
@ -87,8 +86,8 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
SimpleDraweeView userIcon3;
|
||||
@BindView(R.id.choosereceiver_user4_icon)
|
||||
SimpleDraweeView userIcon4;
|
||||
@BindView(R.id.scan_gif)
|
||||
SimpleDraweeView mScanGif;
|
||||
@BindView(R.id.choosereceiver_radar)
|
||||
RadarView mRadarView;
|
||||
@BindView(R.id.scan_user)
|
||||
TextView mScanUser;
|
||||
@BindView(R.id.scan_user_des)
|
||||
@ -203,12 +202,7 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
private void init() {
|
||||
sp = getSharedPreferences(Config.PREFERENCE, Context.MODE_PRIVATE);
|
||||
conUserIconTag = 1;
|
||||
|
||||
DraweeController controller = Fresco.newDraweeControllerBuilder()
|
||||
.setUri("asset:///scan_receiver.gif")
|
||||
.setAutoPlayAnimations(true)
|
||||
.build();
|
||||
mScanGif.setController(controller);
|
||||
mRadarView.setSearching(true);
|
||||
|
||||
mScanHint.setText(Html.fromHtml("<u>" + "好友还没安装光环助手?请点这里" + "</u>"));
|
||||
|
||||
@ -306,10 +300,13 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
@Override
|
||||
protected void onDestroy() {
|
||||
super.onDestroy();
|
||||
mRadarView.setSearching(false);
|
||||
isDestroy = true;
|
||||
isStopScan = true;
|
||||
handler.removeCallbacksAndMessages(null);
|
||||
} @Override
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View v) {
|
||||
if (v == choosereceiver_user1) {
|
||||
connReceiverWifi(0);
|
||||
@ -332,6 +329,7 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
|
||||
startActivity(ShareGhActivity.getIntent(this));
|
||||
} //1.连接网络
|
||||
|
||||
private void connReceiverWifi(int connPosition) {
|
||||
|
||||
if (isStopScan) {
|
||||
@ -380,8 +378,9 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
closeSocket();
|
||||
AppController.remove("FileInfo");
|
||||
} //发送UDP通知信息到 文件接收方 开启ServerSocketRunnable
|
||||
|
||||
private void createSendMsgToServerRunnable(final String ipAddress) {
|
||||
AppController.MAIN_EXECUTOR.execute(new Runnable() {
|
||||
AppController.MAIN_EXECUTOR.execute(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
@ -420,7 +419,9 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
}
|
||||
}
|
||||
}
|
||||
} private void startFileSenderServer(String ipAddress) throws Exception {
|
||||
}
|
||||
|
||||
private void startFileSenderServer(String ipAddress) throws Exception {
|
||||
int serverPort = Constant.DEFAULT_SERVER_COM_PORT;
|
||||
|
||||
// 确保Wifi连接上之后获取得到IP地址
|
||||
@ -493,6 +494,7 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
handler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
mRadarView.setSearching(false);
|
||||
connSuccessAnimView();
|
||||
}
|
||||
});
|
||||
@ -644,11 +646,6 @@ public class ChooseReceiverActivity extends BaseActivity implements View.OnClick
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* 关闭UDP Socket 流
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user