Andorid Studio 制作欢乐写数字(Timer启动+帧动画)

write_layout.setBackgroundResource(R.drawable.bg1);

//获取屏幕的高度和宽度

widthPixels = this.getResources().getDisplayMetrics().widthPixels;

heightPixels = this.getResources().getDisplayMetrics().heightPixels;

//图片是按照1280*720准备的,要适应于其他的分辨率的屏幕

scaleWidth = ((float)widthPixels/720);

scaleHeight = ((float)heightPixels/1280);

try{

//通过输入流打开第一张图片

InputStream is = getResources().getAssets().open(“on1_1.png”);

//通过使用bitmap解析第一张图片

arrdown = BitmapFactory.decodeStream(is);

} catch (IOException e) {

e.printStackTrace();

}

//获取布局的宽高信息

LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) iv_frame.getLayoutParams();

//获取图片缩放后宽度

layoutParams.width = (int)(arrdown.getWidth() * scaleWidth);

//获取图片缩放后高度

layoutParams.height = (int)(arrdown.getHeight() * scaleHeight);

iv_frame.setLayoutParams(layoutParams);

lodimagep(1);

}

private synchronized void lodimagep(int j) {

i = j;

if(i < 25){ //当前图片小于25

String name = “on1_” + i;

//获取图片资源id

int imgid = getResources().getIdentifier(name,“drawable”,“com.example.msi.writenumber”);

iv_frame.setBackgroundResource(imgid);

i++;

}

if(j == 24){ //如果当前图片的位置为24

if(typedialog){ //没有对话框的情况下

dialog(); //调用书写完成对话框方法

}

}

}

这里写图片描述

实现代码如下:

其中R.drawable.frame1为放置所有帧的anmianimation-list

duration为帧持续的时间为0.15s即150ms

public void OnYS(View v){

if(mdiaolg == null){

mdiaolg = new mCustomProgressDialog(this,“演示中单击边缘取消”,R.drawable.frame1);

}

mdiaolg.show();

}

//继承dialog代码如下:

public class mCustomProgressDialog extends ProgressDialog{

private AnimationDrawable mAnimation; //设置对话框的动画资源

private Context mContext;

private ImageView mImageView;

private String mLoadingTip; //设置对话框文字

private TextView mLoadingTv; //显示对话框文字

private int mResid; //资源id

public mCustomProgressDialog(Context context,String content,int id) {

super(context);

this.mContext = context;

this.mLoadingTip = content;

this.mResid = id;

//设置单击对话框周边是否让dialog消失,设置为True

setCanceledOnTouchOutside(true);

}

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.progress_dialog);

//获取布局文件中的TextView

mLoadingTv = findViewById(R.id.loadingTv);

mImageView = findViewById(R.id.loadingIv);

if(mResid == 0){

mImageView.setBackgroundDrawable(null);

}else {

mImageView.setBackgroundResource(mResid);

}

mAnimation = (AnimationDrawable) mImageView.getBackground();

//为了防止在onCreate方法中只显示第一帧的解决方案之一

mImageView.post(new Runnable() {

@Override

public void run() {

mAnimation.start();

}

});

mLoadingTv.setText(mLoadingTip);

}

}

还有操作时候根据鼠标滑动来实现图片切换效果

这里写图片描述

根据实时滑动屏幕的x2,y2来判断手势位置,画完之后弹出dialog完成或者再来一次

如果在中途手离开屏幕,这是耗时操作(?),则发送message,子线程接收message进行handle将图片慢慢的撤回到第一帧

实现代码如下:

linearLayout.setOnTouchListener(new View.OnTouchListener() {

@Override

public boolean onTouch(View v, MotionEvent event) {

switch (event.getAction()){ //获取行动方式头部

case MotionEvent.ACTION_DOWN: //手指按下事件

x1 = event.getX(); //获取手指按下的x坐标

y1 = event.getY(); //获取按下的y坐标

igvx = iv_frame.getLeft(); //获取手指按下图片的x坐标

igvy = iv_frame.getTop(); //图片的y坐标

//判断当手指按下的坐标大于图片位置的坐标时,证明手指按住移动,开始书写

if(x1 >= igvx && x1 <= igvx + (int)(arrdown.getWidth() * scaleWidth)

&& y1 >= igvy && y1 <= igvy + (int)(arrdown.getWidth() * scaleWidth) ){

type = 1; //开启书写

}else {

type = 0; //否则关闭书写

}

break;

case MotionEvent.ACTION_MOVE: //手势移动中判断

igvx = iv_frame.getLeft();

igvy = iv_frame.getTop();

x2 = event.getX();

y2 = event.getY();

//下面是根据笔画以及手势做图片的处理,滑到不同位置,加载不同图片

if(type == 1){

if(x2 >= igvx && x2 <= igvx + (int)(arrdown.getWidth() * scaleWidth)){

if(y2 <= igvy +(int)(arrdown.getHeight() * scaleHeight) / 24 &&

y2 >= igvy)

lodimagep(1);

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 2){

lodimagep(2);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 3){

lodimagep(3);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 4){

lodimagep(4);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 5){

lodimagep(5);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 6){

lodimagep(6);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 7){

lodimagep(7);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 8){

lodimagep(8);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 9){

lodimagep(9);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 10){

lodimagep(10);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 11){

lodimagep(11);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 12){

lodimagep(12);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 13){

lodimagep(13);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 14){

lodimagep(14);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 15){

lodimagep(15);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 16){

lodimagep(16);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 17){

lodimagep(17);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 18){

lodimagep(18);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 19){

lodimagep(19);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 20){

lodimagep(20);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 21){

lodimagep(21);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 22){

lodimagep(22);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 23){

lodimagep(23);

}

else if(y2 <= igvy + (int)(arrdown.getHeight() * scaleHeight) / 24 * 24){

lodimagep(24);

}

}

}

break;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值