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;