Dialog七种模式详解

来源:互联网 发布:千里眼 淘宝 编辑:程序博客网 时间:2024/05/29 12:49

注意:

               点击按钮都会自动关闭对话框,点击对话框外也会导致对话框消失

               屏蔽点击对话框外消失loginDialog是我声明的DIALOG对象)

              loginDialog.setCanceledOnTouchOutside(false);

               屏蔽点击按钮自动消失

                        try {
                                Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
                                field.setAccessible(true);
                                field.set(dialog, true);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }

               显示对话框

                        try {
                                Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
                                field.setAccessible(true);
                                field.set(dialog, true);
                            } catch (Exception e) {
                                e.printStackTrace();
                            }


今天我用自己写的一个Demo 和大家详细介绍一个Android中的对话框的使用技巧。 

 

 


 




1.确定取消对话框

对话框中有2个按钮   通过调用 setPositiveButton 方法 和 setNegativeButton 方法 可以设置按钮的显示内容以及按钮的监听事件。

 

 

 

 


 

 

 

我们使用AlerDialog 创建对话框

 


 

 

AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);  


 

 


使用builder设置对话框的title button icon 等等

 

builder.setIcon(R.drawable.icon);         builder.setTitle("你确定要离开吗?");         builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {             public void onClick(DialogInterface dialog, int whichButton) {                 //这里添加点击确定后的逻辑                showDialog("你选择了确定");             }         });         builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {             public void onClick(DialogInterface dialog, int whichButton) {                 //这里添加点击确定后的逻辑                showDialog("你选择了取消");             }         });         builder.create().show();  



 


  这个dialog用于现实onClick后监听的内容信息

 


 

private void showDialog(String str) {  new AlertDialog.Builder(MainDialog.this)       .setMessage(str)       .show();  }  



 




2.多个按钮信息框

 

 


 

 

 

AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);           builder.setIcon(R.drawable.icon);  builder.setTitle("投票");  builder.setMessage("您认为什么样的内容能吸引您?");  builder.setPositiveButton("有趣味的", new DialogInterface.OnClickListener() {      public void onClick(DialogInterface dialog, int whichButton) {          showDialog("你选择了有趣味的");      }  });  builder.setNeutralButton("有思想的", new DialogInterface.OnClickListener() {      public void onClick(DialogInterface dialog, int whichButton) {          showDialog("你选择了有思想的");                          }  });  builder.setNegativeButton("主题强的", new DialogInterface.OnClickListener() {      public void onClick(DialogInterface dialog, int whichButton) {          showDialog("你选择了主题强的");        }  });  builder.create().show();  



 





3.列表框

 

 


 


这个数组用于列表选择


 

 

final String[] mItems = {"item0","item1","itme2","item3","itme4","item5","item6"};  AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);           builder.setTitle("列表选择框");          builder.setItems(mItems, new DialogInterface.OnClickListener() {              public void onClick(DialogInterface dialog, int which) {                  //点击后弹出窗口选择了第几项                 showDialog("你选择的id为" + which + " , " + mItems[which]);              }          });          builder.create().show();  





4.单项选择列表框

 

 

 


mSingleChoice 用于记录单选中的ID

 

 

int mSingleChoiceID = -1;  AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);     mSingleChoiceID = -1;  builder.setIcon(R.drawable.icon);      builder.setTitle("单项选择");      builder.setSingleChoiceItems(mItems, 0, new DialogInterface.OnClickListener() {          public void onClick(DialogInterface dialog, int whichButton) {                  mSingleChoiceID = whichButton;                  showDialog("你选择的id为" + whichButton + " , " + mItems[whichButton]);          }      });      builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {          public void onClick(DialogInterface dialog, int whichButton) {              if(mSingleChoiceID > 0) {              showDialog("你选择的是" + mSingleChoiceID);              }          }      });      builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {          public void onClick(DialogInterface dialog, int whichButton) {            }      });     builder.create().show();  



 





5.进度条框

 

 


 


点击进度条框按钮后 开启一个线程计算读取的进度 假设读取结束为 100
Progress
在小于100的时候一直在线程中做循环++ 只到读取结束后,停止线程。

 


 

  

       mProgressDialog = new ProgressDialog(MainDialog.this);       mProgressDialog.setIcon(R.drawable.icon);       mProgressDialog.setTitle("进度条窗口");       mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);       mProgressDialog.setMax(MAX_PROGRESS);       mProgressDialog.setButton("确定", new DialogInterface.OnClickListener() {           public void onClick(DialogInterface dialog, int whichButton) {               //这里添加点击后的逻辑          }       });       mProgressDialog.setButton2("取消", new DialogInterface.OnClickListener() {           public void onClick(DialogInterface dialog, int whichButton) {               //这里添加点击后的逻辑          }       });       mProgressDialog.show();       new Thread(this).start();    public void run() {  int Progress = 0;  while(Progress < MAX_PROGRESS) {  try {      Thread.sleep(100);      Progress++;        mProgressDialog.incrementProgressBy(1);  } catch (InterruptedException e) {      // TODO Auto-generated catch block     e.printStackTrace();  }     }  



 



6.多项选择列表框



 

 

 



 


MultiChoiceID 用于记录多选选中的id号 存在ArrayList中
选中后 add 进ArrayList
取消选中后 remove 出ArrayList。

 

ArrayList <Integer>MultiChoiceID = new ArrayList <Integer>();   AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);     MultiChoiceID.clear();  builder.setIcon(R.drawable.icon);      builder.setTitle("多项选择");      builder.setMultiChoiceItems(mItems,              new boolean[]{false, false, false, false, false, false, false},              new DialogInterface.OnMultiChoiceClickListener() {                  public void onClick(DialogInterface dialog, int whichButton,                          boolean isChecked) {                     if(isChecked) {                         MultiChoiceID.add(whichButton);                         showDialog("你选择的id为" + whichButton + " , " + mItems[whichButton]);                     }else {                         MultiChoiceID.remove(whichButton);                     }                                        }              });      builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {          public void onClick(DialogInterface dialog, int whichButton) {              String str = "";              int size = MultiChoiceID.size();              for (int i = 0 ;i < size; i++) {              str+= mItems[MultiChoiceID.get(i)] + ", ";              }              showDialog("你选择的是" + str);          }      });      builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {          public void onClick(DialogInterface dialog, int whichButton) {            }      });     builder.create().show();  



 



7.自定义布局

 

 


 


讲到自定义布局我就得多说一说了,为什么要多说一说呢? 
其实自定义布局在Android的开发中非常重要 因为它能让开发者做出自己五彩缤纷的Activity 而不用去使用系统枯燥的界面。

自定义dialog有什么好处?

比如我们在开发过长当中 要通过介绍系统发送的一个广播弹出一个dialog . 但是dialog必需是基于activity才能呈现出来 如果没有activity 的话 程序就会崩溃。所以我们可以写一个自定义的 dialog 把它定义成一个activity
这样我们收到一条打开dialog的广播后 直接启动这个 activity  程序正常运行~~ 

这就是自定义dialog的好处。

注明:下面这个例子只是写了自定义dialog 没有把它单独的写在一个activity中 如果须要的话 可以自己改一下。


 

AlertDialog.Builder builder = new AlertDialog.Builder(MainDialog.this);    LayoutInflater factory = LayoutInflater.from(this);   final View textEntryView = factory.inflate(R.layout.test, null);       builder.setIcon(R.drawable.icon);       builder.setTitle("自定义输入框");       builder.setView(textEntryView);       builder.setPositiveButton("确定", new DialogInterface.OnClickListener() {           public void onClick(DialogInterface dialog, int whichButton) {                      EditText userName = (EditText) textEntryView.findViewById(R.id.etUserName);           EditText password = (EditText) textEntryView.findViewById(R.id.etPassWord);           showDialog("姓名 :"  + userName.getText().toString()  + "密码:" + password.getText().toString() );           }       });       builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {           public void onClick(DialogInterface dialog, int whichButton) {             }       });     builder.create().show();  



 


<?xml version="1.0" encoding="utf-8"?>  <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:layout_width="wrap_content" android:orientation="horizontal" android:id="@+id/dialog">  <LinearLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:orientation="horizontal" android:id="@+id/dialogname">    <TextView android:layout_height="wrap_content"  android:layout_width="wrap_content"  android:id="@+id/tvUserName"  android:text="姓名:"/>  <EditText android:layout_height="wrap_content"  android:layout_width="wrap_content"  android:id="@+id/etUserName"  android:minWidth="200dip"/>  </LinearLayout>    <LinearLayout android:layout_height="wrap_content" android:layout_width="wrap_content" android:orientation="horizontal" android:id="@+id/dialognum"  android:layout_below="@+id/dialogname" >    <TextView android:layout_height="wrap_content"  android:layout_width="wrap_content"  android:id="@+id/tvPassWord"  android:text="密码:"/>  <EditText android:layout_height="wrap_content"  android:layout_width="wrap_content"  android:id="@+id/etPassWord"  android:minWidth="200dip"/>   </LinearLayout>      </RelativeLayout>  



 


 

 

 


8.
读取进度框

显示一个正在转圈的进度条loading

 


mProgressDialog = new ProgressDialog(this);   mProgressDialog.setTitle("读取ing");   mProgressDialog.setMessage("正在读取中请稍候");   mProgressDialog.setIndeterminate(true);   mProgressDialog.setCancelable(true);   mProgressDialog.show();  

 

 

 





最后如果你还是觉得我写的不够详细 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习 雨松MOMO希望可以和大家一起进步。

下载地址:http://download.csdn.net/source/3438085

 

自定义View界面大合集

 

 





 

 

 

雨松MOMO带大家盘点Android 中的自定义View界面的绘制


今天我用自己写的一个Demo 和大家详细介绍一个Android中自定义View中的使用与绘制技巧。


 


 



1.自定义view绘制字符串

 

       
       相信在实际开发过程中必然很多地方都须要用到系统字 为什么会用到系统字? 方便 省内存 我相信做过J2ME游戏开发的朋友应该深知内存有多么多么重要  而且使用它还可以带来一个更重要的好处就是很方便的可以实现多国语言的切换 笔者现在在正在做的一个产品就是可以多语言切换的软件  有英语 繁体中文 等等 设想如果使用图片字的话那每个语言都须要出一套图,我用一个例子简单介绍一下绘制字符串。

 


 

 

 


 

 1 package cn.m15.xys;   2  3    4  5 import android.app.Activity;   6  7 import android.content.Context;   8  9 import android.graphics.Canvas;   10  11 import android.graphics.Color;   12  13 import android.graphics.Paint;   14  15 import android.graphics.Paint.FontMetrics;   16  17 import android.os.Bundle;   18  19 import android.view.Display;   20  21 import android.view.View;   22  23    24  25 public class Font extends Activity {   26  27     public int mScreenWidth = 0;   28  29     public int mScreenHeight = 0;   30  31     @Override   32  33     protected void onCreate(Bundle savedInstanceState) {   34  35     setContentView(new FontView(this));   36  37     // 获取屏幕宽高  38  39     Display display = getWindowManager().getDefaultDisplay();   40  41     mScreenWidth  = display.getWidth();   42  43     mScreenHeight = display.getHeight();   44  45     super.onCreate(savedInstanceState);   46  47    48  49     }   50  51    52  53     class FontView extends View {   54  55         public final static String STR_WIDTH = "获取字符串宽为:";    56  57         public final static String STR_HEIGHT = "获取字体高度为:";    58  59         Paint mPaint = null;   60  61            62  63     public FontView(Context context) {   64  65         super(context);   66  67         mPaint = new Paint();   68  69     }   70  71    72  73     @Override   74  75     protected void onDraw(Canvas canvas) {   76  77         //设置字符串颜色  78  79         mPaint.setColor(Color.WHITE);   80  81         canvas.drawText("当前屏幕宽" + mScreenWidth, 0, 30, mPaint);   82  83         canvas.drawText("当前屏幕高"+ mScreenHeight, 0, 60, mPaint);   84  85         //设置字体大小  86  87         mPaint.setColor(Color.RED);   88  89         mPaint.setTextSize(18);   90  91         canvas.drawText("字体大小为18", 0, 90, mPaint);   92  93         //消除字体锯齿  94  95         mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);   96  97         canvas.drawText("消除字体锯齿后", 0, 120, mPaint);   98  99         //获取字符串宽度 100 101         canvas.drawText(STR_WIDTH + getStringWidth(STR_WIDTH), 0, 150, mPaint);  102 103         //获取字体高度 104 105         canvas.drawText(STR_HEIGHT + getFontHeight(), 0, 180, mPaint);  106 107         //从string.xml读取字符串绘制 108 109         mPaint.setColor(Color.YELLOW);  110 111         canvas.drawText(getResources().getString(R.string.string_font), 0, 210, mPaint);  112 113         super.onDraw(canvas);  114 115     }  116 117       118 119     /** 120 121  * 获取字符串宽 122 123  * @param str 124 125  * @return 126 127 */  128 129     private int getStringWidth(String str) {  130 131         return (int) mPaint.measureText(STR_WIDTH);   132 133     }  134 135     /* 136 137  * 获取字体高度 138 139 */  140 141     private int getFontHeight() {  142 143         FontMetrics fm = mPaint.getFontMetrics();  144 145         return (int)Math.ceil(fm.descent - fm.top) + 2;  146 147     }  148 149     }  150 151 }  



 


 
2.绘制无规则几何图形

        绘制无规则几何图形似乎在实际工作中很少可以用到 原因是用程序去绘制图形即使在精准再好看也不会有美术出的图片好看 但是使用程序绘制图形作为学习来说却是基础中的基础,所以建议大家都看一看。

 

 


 

 

 


 

 1 package cn.m15.xys;   2  3    4  5 import android.app.Activity;   6  7 import android.content.Context;   8  9 import android.graphics.Canvas;   10  11 import android.graphics.Color;   12  13 import android.graphics.Paint;   14  15 import android.graphics.Path;   16  17 import android.graphics.RectF;   18  19 import android.os.Bundle;   20  21 import android.view.View;   22  23    24  25 public class Geometry extends Activity {   26  27     public int mScreenWidth = 0;   28  29     public int mScreenHeight = 0;   30  31    32  33     @Override   34  35     protected void onCreate(Bundle savedInstanceState) {   36  37     setContentView(new GeometryView(this));   38  39     super.onCreate(savedInstanceState);   40  41    42  43     }   44  45    46  47     class GeometryView extends View {   48  49     Paint mPaint = null;   50  51    52  53     public GeometryView(Context context) {   54  55         super(context);   56  57         mPaint = new Paint();   58  59         mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);   60  61     }   62  63    64  65     @Override   66  67     protected void onDraw(Canvas canvas) {   68  69         super.onDraw(canvas);   70  71        72  73         //设置画布颜色 也就是背景颜色  74  75         canvas.drawColor(Color.WHITE);   76  77           78  79         mPaint.setColor(Color.BLACK);   80  81         canvas.drawText("绘制无规则几何图形喔!!!", 150, 30, mPaint);   82  83            84  85         //绘制一条线  86  87         mPaint.setColor(Color.BLACK);   88  89         mPaint.setStrokeWidth(4);   90  91         canvas.drawLine(0, 0, 100, 100, mPaint);   92  93            94  95         //绘制一个矩形  96  97         mPaint.setColor(Color.YELLOW);   98  99         canvas.drawRect(0, 120, 100, 200, mPaint);  100 101           102 103         //绘制一个圆形 104 105         mPaint.setColor(Color.BLUE);  106 107         canvas.drawCircle(80, 300, 50, mPaint);  108 109           110 111         //绘制一个椭圆 112 113         mPaint.setColor(Color.CYAN);  114 115         canvas.drawOval(new RectF(300,370,120,100), mPaint);  116 117           118 119         //绘制多边形 120 121         mPaint.setColor(Color.BLACK);  122 123         Path path = new Path();  124 125         path.moveTo(150+5 , 400 -50);  126 127         path.lineTo(150+45, 400 - 50);  128 129         path.lineTo(150+30, 460 - 50);  130 131         path.lineTo(150+20, 460 - 50);  132 133         path.close();  134 135         canvas.drawPath(path, mPaint);  136 137           138 139     }  140 141     }  142 143 }  



 



3.图片的绘制以及旋转缩放的实现


        在这点上Android 确实比J2ME 强大很多  手机游戏开发最痛苦的是什么?? 是游戏引擎的开发,但是工程师会把大部分时间浪费在对坐标上,如果写引擎的时候没有把自适应考虑周全后期会非常痛苦,现在手机屏幕分辨率是各式各样 内存大小也是各式各样 所以可见自适应屏幕算法有多么的重要。


 


 



 


 

 1 package cn.m15.xys;   2  3    4  5 import android.app.Activity;   6  7 import android.content.Context;   8  9 import android.graphics.Bitmap;   10  11 import android.graphics.BitmapFactory;   12  13 import android.graphics.Canvas;   14  15 import android.graphics.Matrix;   16  17 import android.graphics.Paint;   18  19 import android.os.Bundle;   20  21 import android.view.View;   22  23 import android.view.View.OnClickListener;   24  25 import android.widget.Button;   26  27 import android.widget.LinearLayout;   28  29    30  31 public class Image extends Activity {   32  33     ImageView imageView = null;   34  35    36  37     @Override   38  39     protected void onCreate(Bundle savedInstanceState) {   40  41     imageView = new ImageView(this);   42  43     setContentView(R.layout.image);   44  45     LinearLayout ll = (LinearLayout) findViewById(R.id.iamgeid);   46  47     ll.addView(imageView);   48  49     // 向左移动  50  51     Button botton0 = (Button) findViewById(R.id.buttonLeft);   52  53     botton0.setOnClickListener(new OnClickListener() {   54  55         @Override   56  57         public void onClick(View arg0) {   58  59         imageView.setPosLeft();   60  61         }   62  63     });   64  65    66  67     // 向右移动  68  69     Button botton1 = (Button) findViewById(R.id.buttonRight);   70  71     botton1.setOnClickListener(new OnClickListener() {   72  73         @Override   74  75         public void onClick(View arg0) {   76  77         imageView.setPosRight();   78  79         }   80  81     });   82  83     // 左旋转  84  85     Button botton2 = (Button) findViewById(R.id.buttonRotationLeft);   86  87     botton2.setOnClickListener(new OnClickListener() {   88  89         @Override   90  91         public void onClick(View arg0) {   92  93         imageView.setRotationLeft();   94  95         }   96  97     });   98  99   100 101     // 右旋转 102 103     Button botton3 = (Button) findViewById(R.id.buttonRotationRight);  104 105     botton3.setOnClickListener(new OnClickListener() {  106 107         @Override  108 109         public void onClick(View arg0) {  110 111         imageView.setRotationRight();  112 113         }  114 115     });  116 117   118 119     // 缩小 120 121     Button botton4 = (Button) findViewById(R.id.buttonNarrow);  122 123     botton4.setOnClickListener(new OnClickListener() {  124 125   126 127         @Override  128 129         public void onClick(View arg0) {  130 131         imageView.setNarrow();  132 133         }  134 135     });  136 137   138 139     // 放大 140 141     Button botton5 = (Button) findViewById(R.id.buttonEnlarge);  142 143     botton5.setOnClickListener(new OnClickListener() {  144 145   146 147         @Override  148 149         public void onClick(View arg0) {  150 151         imageView.setEnlarge();  152 153         }  154 155     });  156 157   158 159     super.onCreate(savedInstanceState);  160 161   162 163     }  164 165   166 167     class ImageView extends View {  168 169     Paint mPaint = null;  170 171     Bitmap bitMap = null;  172 173     Bitmap bitMapDisplay = null;  174 175     int m_posX = 120;  176 177     int m_posY = 50;  178 179     int m_bitMapWidth = 0;  180 181     int m_bitMapHeight = 0;  182 183     Matrix mMatrix = null;  184 185     float mAngle = 0.0f;  186 187     float mScale = 1f;//1为原图的大小 188 189   190 191     public ImageView(Context context) {  192 193         super(context);  194 195         mPaint = new Paint();  196 197         mPaint.setFlags(Paint.ANTI_ALIAS_FLAG);  198 199         bitMap = BitmapFactory.decodeResource(this.getResources(),  200 201             R.drawable.image);  202 203         bitMapDisplay = bitMap;  204 205         mMatrix = new Matrix();  206 207         // 获取图片宽高 208 209         m_bitMapWidth = bitMap.getWidth();  210 211         m_bitMapHeight = bitMap.getHeight();  212 213     }  214 215   216 217     // 向左移动 218 219     public void setPosLeft() {  220 221         m_posX -= 10;  222 223     }  224 225   226 227     // 向右移动 228 229     public void setPosRight() {  230 231         m_posX += 10;  232 233     }  234 235   236 237     // 向左旋转 238 239     public void setRotationLeft() {  240 241         mAngle--;  242 243         setAngle();  244 245     }  246 247   248 249     // 向右旋转 250 251     public void setRotationRight() {  252 253         mAngle++;  254 255         setAngle();  256 257     }  258 259   260 261     // 缩小图片 262 263     public void setNarrow() {  264 265         if (mScale > 0.5) {  266 267         mScale -= 0.1;  268 269         setScale();  270 271         }  272 273     }  274 275   276 277     // 放大图片 278 279     public void setEnlarge() {  280 281         if (mScale < 2) {  282 283         mScale += 0.1;  284 285         setScale();  286 287         }  288 289     }  290 291   292 293     // 设置缩放比例 294 295     public void setAngle() {  296 297         mMatrix.reset();  298 299         mMatrix.setRotate(mAngle);  300 301         bitMapDisplay = Bitmap.createBitmap(bitMap, 0, 0, m_bitMapWidth,  302 303             m_bitMapHeight, mMatrix, true);  304 305     }  306 307   308 309     // 设置旋转比例 310 311     public void setScale() {  312 313         mMatrix.reset();  314 315         //float sx X轴缩放 316 317 //float sy Y轴缩放 318 319         mMatrix.postScale(mScale, mScale);  320 321         bitMapDisplay = Bitmap.createBitmap(bitMap, 0, 0, m_bitMapWidth,  322 323             m_bitMapHeight, mMatrix, true);  324 325     }  326 327   328 329     @Override  330 331     protected void onDraw(Canvas canvas) {  332 333         super.onDraw(canvas);  334 335         canvas.drawBitmap(bitMapDisplay, m_posX, m_posY, mPaint);  336 337         invalidate();  338 339     }  340 341     }  342 343 }  



 

 

 


 

<?xml version="1.0" encoding="utf-8"?>  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:id="@+id/iamgeid"      android:orientation="vertical"      android:layout_width="fill_parent"      android:layout_height="fill_parent"      >          <Button android:id="@+id/buttonLeft"              android:layout_width="fill_parent" android:layout_height="wrap_content"              android:text="图片向左移动"              />          <Button android:id="@+id/buttonRight"              android:layout_width="fill_parent" android:layout_height="wrap_content"              android:text="图片向右移动"              />          <Button android:id="@+id/buttonRotationLeft"              android:layout_width="fill_parent" android:layout_height="wrap_content"              android:text="图片左旋转"              />          <Button android:id="@+id/buttonRotationRight"              android:layout_width="fill_parent" android:layout_height="wrap_content"              android:text="图片右旋转"              />          <Button android:id="@+id/buttonNarrow"              android:layout_width="fill_parent" android:layout_height="wrap_content"              android:text="图片缩小"              />          <Button android:id="@+id/buttonEnlarge"              android:layout_width="fill_parent" android:layout_height="wrap_content"              android:text="图片放大"              />  </LinearLayout>  



 


4.播放frame动画


        做游戏的话播放动画可就是必不可少的元素 帧动画帧动画 顾名思义是一帧一帧的播放 。 实际在开发中为了节省内存美术会把人物的图片切成一小块一小块然后由程序根据编辑器生成的点把图片在拼接起来这样就可以做到用更少的图片去实现更多的动画 效果因为不太方便介绍图片编辑器 这个demo我只给大家简单的介绍一下播放动画的原理 后期我会深入讲解。
              如图所示这个小人一直在行走 实际上是4张图片在来回切换 每张图片延迟500毫秒 后播下一张 以此类推。



 


       

 

 

 


 

package cn.m15.xys;    import android.app.Activity;  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.os.Bundle;  import android.view.View;    public class FramAnimation extends Activity {      public final static int ANIM_COUNT = 4;        @Override      protected void onCreate(Bundle savedInstanceState) {      setContentView(new FramView(this));      super.onCreate(savedInstanceState);        }        class FramView extends View {      Bitmap[] bitmap = new Bitmap[ANIM_COUNT];      Bitmap display = null;      Paint paint = null;      long startTime = 0;      int playID = 0;        public FramView(Context context) {          super(context);          for (int i = 0; i < ANIM_COUNT; i++) {          bitmap[i] = BitmapFactory.decodeResource(this.getResources(),              R.drawable.hero_a + i);          }          display = bitmap[0];          paint = new Paint();          startTime = System.currentTimeMillis();      }        @Override      protected void onDraw(Canvas canvas) {          super.onDraw(canvas);          paint.setColor(Color.WHITE);          canvas.drawText("播放动画中...", 100, 30, paint);          long nowTime = System.currentTimeMillis();          if (nowTime - startTime >= 500) {          startTime=nowTime;          playID++;          if (playID >= ANIM_COUNT) {              playID = 0;          }          canvas.drawBitmap(bitmap[playID], 100, 100, paint);          }          invalidate();      }      }    }  



 





自定义DIALOG点击任意按钮不消失

使用反射:
在你的setPositiveButton中添加:
//用于不关闭对话框

try {
Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, false);
} catch (Exception e) {
e.printStackTrace();

添加上述代码后就可以使dialog无法关闭,在你需要关闭的地方,添加:
//关闭对话框

try {
Field field = dialog.getClass().getSuperclass().getDeclaredField("mShowing");
field.setAccessible(true);
field.set(dialog, true);
} catch (Exception e) {
e.printStackTrace();
}


原创粉丝点击