Android编程常用技巧实例总结

本文实例讲述了Android编程常用技巧。分享给大家供大家参考,具体如下:

1. 登录的时候,如果输入有误,则输入框左右震动,表示输入有误
在res下准备一个anim文件夹,里面包含两个文件,main_login_shake.xml 和 main_login_cycle_7.xml,

其中,main_login_shake.xml如下:

<?xml version="1.0" encoding="utf-8"?>
<translate
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:fromXDelta="0"
  android:toXDelta="10"
  android:duration="1000"
  android:interpolator="@anim/main_login_cycle_7" />

上面文件中引用了main_login_cycle_7.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" android:cycles="7" />

这两段代码的意思就是在1秒钟之类,x坐标从0到10晃动7次

看java代码:

shakeanim = AnimationUtils.loadAnimation(this,R.anim.main_login_shake);
btn_login.setOnClickListener(new OnClickListener() {
  @Override
  public void onClick(View v) {
   boolean ready = true;
   String username=et_username.getText().toString();
   String password=et_password.getText().toString();
   if (!username.matches("^\\w{1,}+$")) {
    ready = false;
    et_username.startAnimation(shakeanim);
   }
   if (!password.matches("^\\w{1,}+$")) {
    ready = false;
    et_password.startAnimation(shakeanim);
   }
   if(selectClinic==null){
    ready = false;
    et_clinic.startAnimation(shakeanim);
   }
   if (ready) {
    loginStart(username,password,Long.parseLong(selectClinic.get("id").toString()),Integer.parseInt(selectClinic.get("type_id").toString()));
   }
  }
});

2. 当一个Activity中很多地方需要使用到对话框,可以如下操作:

showDialog(R.id.wait_edit_arriveltime);
showDialog(R.id.wait_edit_yuyuedata);
showDialog(R.id.wait_edit_close);
......
protected Dialog onCreateDialog(int id) {
  Dialog dialog = null;
  switch (id) {
  case R.id.wait_edit_yuyuedata:
    DatePickerDialog.OnDateSetListener dateListener = new DatePickerDialog.OnDateSetListener() {
     @Override
     public void onDateSet(DatePicker datePicker,int year, int month, int dayOfMonth) {
      wait_edit_yuyuedata.setText(dayOfMonth + "/"+(month+1)+"/"+year);
     }
    };
    dialog = new DatePickerDialog(this, dateListener, Integer.parseInt(app.getAppointedDate().split("/")[2]), Integer.parseInt(app.getAppointedDate().split("/")[1]), Integer.parseInt(app.getAppointedDate().split("/")[0]));
    break;
  case R.id.wait_edit_arriveltime:
   TimePickerDialog.OnTimeSetListener timeListener = new TimePickerDialog.OnTimeSetListener() {
    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
     wait_edit_arriveltime.setText(hourOfDay+":"+minute);
    }
   };
   dialog = new TimePickerDialog(this, timeListener, Integer.parseInt(app.getEstimateArriveTime().split(":")[0]), Integer.parseInt(app.getEstimateArriveTime().split(":")[1]), true);
   break;
  case R.id.wait_edit_close:
   AlertDialog.Builder builder = new AlertDialog.Builder(EditWaitActivity.this);
   builder.setTitle("您要确定放弃编辑吗?");
   builder.setPositiveButton("确定",new DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface arg0, int arg1) {
     EditWaitActivity.this.finish();
    }});
   builder.setNegativeButton("取消",new DialogInterface.OnClickListener() {
    public void onClick(DialogInterface dialog,int whichButton) {
    }
   });
   builder.show();
   break;
  default:
   break;
  }
  return dialog;
}

3. 标准的adapter的格式,以后就按照这样的形式写

public class MyAdapter extends BaseAdapter{
 Context context;
 PageRecord<Appointment> data;
 private ViewHolder tempHolder;
 private View tempView;
 public MyAdapter(Context context,PageRecord<Appointment> data){
  this.context = context;
  this.data = data;
 }
 public View getView(int position, View convertView, ViewGroup parent) {
  final ViewHolder holder;
  Appointment app = data.getResultSet().get(position);
  if(convertView==null){
   convertView=LayoutInflater.from(context).inflate(R.layout.item, null);
   holder=new ViewHolder(convertView);
   convertView.setTag(holder);
  }else{
   holder=(ViewHolder) convertView.getTag();
  }
  tempHolder = holder;
  tempView = convertView;
  holder.setData(app);
  return convertView;
 }
 public long getItemId(int position) {
  return position;
 }
 public Object getItem(int position) {
  return data.getResultSet().get(position);
 }
 public int getCount() {
  return data.getResultSet()==null?0:data.getResultSet().size();
 }
 public void setData(PageRecord<Appointment> data){
  this.data = data;
  this.notifyDataSetChanged();
  tempView.invalidate();
 }
 /**
  * 重新绘制
  * @param app
  */
 public void redraw(Appointment app){
  tempHolder.timeView.setText(app.getAppointedDate()+" "+app.getEstimateArriveTime());
  tempHolder.nameView.setText(app.getPatient().getNameEN());
  tempHolder.doctorView.setText(app.getMo().getNameEN());
  tempView.invalidate();
 }
 private class ViewHolder{
  private TextView timeView;
  private TextView nameView;
  private TextView doctorView;
  public ViewHolder(View convertView){
   timeView = (TextView) convertView.findViewById(R.id.yuyuetime);
   nameView = (TextView) convertView.findViewById(R.id.yuyuename);
   doctorView = (TextView) convertView.findViewById(R.id.doctorname);
  }
  public void setData(Appointment app){
   timeView.setText(app.getAppointedDate()+" "+app.getEstimateArriveTime());
   nameView.setText(app.getPatient().getNameEN());
   doctorView.setText(app.getMo().getNameEN());
  }
 }
}

4. 获取屏幕分辨率的两种方法

// 方法1 Android获得屏幕的宽和高
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
int screenWidth = display.getWidth();
int screenHeight = display.getHeight();
// 方法2
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
float width=dm.widthPixels*dm.density;
float height=dm.heightPixels*dm.density;

打印结果:width:320.0,height:480.0,screenWidth:320,screenHeight:480

dpi值的是屏幕上每英寸的像素点。如果一个160dpi的屏幕,1dp=1px。假如我现在有一个480*800,160dp的屏,那么他的实际面积要比480*800,240dp的屏面积大,但是清晰度却不如后面这个屏。

如果有些实体手机在做测试的时候发现得到的分辨率比实际的分辨率小很多,那么这里得到的是dp单位的像素值,可以通过dp的密度值来转换,如下:

480*800的手机(WVGA)density=240。

转换公式如下:

pixs =dips * (density/160)
dips=(pixs*160)/density

480*800单位是px。而320*533单位是dp

5,资源的一些应用

* 不同的layout

Android手机屏幕大小不一,有480x320,640x360,800x480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下创建不同的layout文件夹,比如:layout-640x360,layout-800x480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。

* hdpi、mdpi、ldpi

前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。

* drawable- hdpi、drawable- mdpi、drawable-ldpi的区别:

drawable-hdpi里面存放高分辨率的图片,如WVGA (480x800),FWVGA (480x854)
drawable-mdpi里面存放中等分辨率的图片,如HVGA (320x480)
drawable-ldpi里面存放低分辨率的图片,如QVGA (240x320)

系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。

* 屏幕方向

横屏竖屏自动切换

可以在res目录下建立layout-port和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,这样在手机屏幕方向变化的时候系统会自动调用相应的布局文件,避免一种布局文件无法满足两种屏幕显示的问题。

* 禁用自动切换

只需要在AndroidManifest.xml文件中加入android:screenOrientation属性限制。
Android:screenOrientation="landscape" //是限制此页面横屏显示
Android:screenOrientation="portrait"   //是限制此页面数竖屏显示

* 字体自适应大小

方法1:

首先根据不同分辨率获取不同字体大小。

在RES里创建

values-480x320/strings.xml 里面设置<dimen name="Text_size">30px</dimen>

values-800x400/strings.xml 里面设置<dimen name="Text_size">40px</dimen>
分别代表480X320 和 800X400分辨率情况下 字号为30px和40px;

在java文件中这样调用

代码如下:

int sizeOfText = (int) this.getResources().getDimension(R.dimen.Text_size);

方法2:

在视图的 onsizechanged里获取视图宽度,一般情况下默认宽度是320,所以计算一个缩放比率rate = (float) w/320  w是实际宽度

然后在设置字体尺寸时 paint.setTextSize((int)(8*rate));  8是在分辨率宽为320 下需要设置的字体大小实际字体大小 = 默认字体大小 x rate

希望本文所述对大家Android程序设计有所帮助。

(0)

相关推荐

  • Android Studio使用小技巧:提取方法代码片段

    今天来给大家介绍一个非常有用的Studio Tips,有些时候我们在一个方法内部写了过多的代码,然后想要把一些代码提取出来再放在一个单独的方法里,通常我们的做法是复制粘贴,现在我来教给大家一个非常简洁的方法,先看下gif演示吧: 怎么样很方便吧?操作方法很简单,只需要选中一些代码,然后操作快捷键 Cmd + Option + M 就ok了,Windows是 Ctrl + Alt + M,很简单方便的一个小技巧分享给大家.

  • Android实用编程技巧代码总结

    本文实例总结了Android实用编程技巧.分享给大家供大家参考,具体如下: 1.让一个图片透明: Bitmap buffer = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444); buffer.eraseColor(Color.TRANSPARENT); 2.直接发送邮件: Intent intent = new Intent(Intent.ACTION_SENDTO, Uri .fromParts("mailto"

  • Android编程之文件读写操作与技巧总结【经典收藏】

    本文实例总结了Android文件读写操作.分享给大家供大家参考,具体如下: 在Android中的文件放在不同位置,它们的读取方式也有一些不同. 本文对android中对资源文件的读取.数据区文件的读取.SD卡文件的读取及RandomAccessFile的方式和方法进行了整理.供参考. 一.资源文件的读取: 1) 从resource的raw中读取文件数据: String res = ""; try{ //得到资源中的Raw数据流 InputStream in = getResources

  • Android编程之OpenGL绘图技巧总结

    本文实例讲述了Android编程之OpenGL绘图技巧.分享给大家供大家参考,具体如下: 很久不用OpenGL ES绘图,怕自己忘记了,于是重新复习一遍,顺便原理性的东西总结如下: 1. Android 3D坐标系统 如图: Android的三维坐标系统中: 坐标原点位于中央, X轴从左向右延伸,原点左边的值为负数,右边为正数: Y轴从下向上延伸,原点下边的值为负数,上边为正数: Z轴屏幕里面向外面延伸,屏幕里面为负数,外面为正数. 2. 开发工具(OpenGL和OpenGL ES)介绍 Ope

  • 解析Android开发优化之:从代码角度进行优化的技巧

    通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能.下面我们就从几个方面来了解Android开发过程中的代码优化. 1)静态变量引起内存泄露 在代码优化的过程中,我们需要对代码中的静态变量特别留意.静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销毁.所以,一般情况下,静态变量

  • Android开发技巧之我的菜单我做主(自定义菜单)

    Android SDK本身提供了一种默认创建菜单的机制.但通过这种机制创建的菜单虽然从功能上很完备,但在界面效果上实在是有点"土".对于一个拥有绚丽界面的程序配上一个有点"土"的菜单,会使用户感觉很怪,甚至会使绚丽的界面大打折扣.实际上,对于如此灵活和强大的Android系统,修改菜单的样式只是小菜一碟.为程序加入漂亮菜单的方法很多.在本节先介绍一种比较常用的方法,就是通过onKeyDown事件方法和PopupWindow实现自定义的菜单.至于通过这种技术能否设计出

  • Android Studio使用小技巧:自定义Logcat

    我们都知道Logcat是我们Android开发调试最常用的一个工具,但是Android Studio默认的Logcat调试的颜色是一样的,我们不好区分verbose.debug.error等分类信息,今天就来教大家自定义Logcat的提示信息. 打开Preference->Editor->Colors & Fonts->Android Logcat(或者搜索logcat),如果我们默认选择的是Darcula主题会看到如下界面: 这个默认的是无法更改,我们可以点击"Sav

  • android 为应用程序创建桌面快捷方式技巧分享

    我们开发一款软件后,如果手机装的软件过多,去翻的话会很难翻的,所以,在主页面有一个快捷方式的话会很不错的,下面是详细代码: 复制代码 代码如下: /** * 创建桌面快捷方式 */ private void createShortcut() { SharedPreferences setting = getSharedPreferences("silent.preferences", 0); // 判断是否第一次启动应用程序(默认为true) boolean firstStart =

  • Android编程开发之性能优化技巧总结

    本文详细总结了Android编程开发之性能优化技巧.分享给大家供大家参考,具体如下: 1.http用gzip压缩,设置连接超时时间和响应超时时间 http请求按照业务需求,分为是否可以缓存和不可缓存,那么在无网络的环境中,仍然通过缓存的httpresponse浏览部分数据,实现离线阅读. 2.listview 性能优化 1).复用convertView 在getItemView中,判断convertView是否为空,如果不为空,可复用.如果couvertview中的view需要添加listern

  • Android Studio使用小技巧:布局预览时填充数据

    我们都知道Android Studio用起来很棒,其中布局预览更棒.我们在调UI的时候基本是需要实时预览来看效果的,在Android Studio中只需要切换到Design就可以看到,而且我们需要在布局上填充数据预览效果更好,比如我们在TextView中设定text属性来看下字体大小与布局是否正确,但是呢正式环境我们又需要移除这些额外的数据,不然看着很不舒服,这个时候就用到了本篇博客介绍的一个技巧. 废话不多说,直接上图: 上述示例中只需要在xml布局文件中添加tools命名空间的text属性就

  • Android开发技巧之像QQ一样输入文字和表情图像

    EditText和TextView一样,也可以进行图文混排.所不同的是,TextView只用于显示图文混排效果,而EditText不仅可显示,也可混合输入文字和图像,让我们先回顾一下图5.2所示的QQ聊天输入框,在输入框中可以同时输入文字和表情图像.实际上,这种效果在Android SDK中只需要几行代码就可以实现.为了使读者更有学习的冲动,先来欣赏一下即将实现的效果,如图5.16所示. 图5.16 在EditText控件中输入文字和图像 为了实现这个程序,首先来准备一些要用到的素材,也就是要在

  • Android开发中常用的一些小技巧

    Activity.startActivities() 常用于在应用程序中间启动其他的Activity. TextUtils.isEmpty() 简单的工具类,用于检测是否为空 Html.fromHtml() 用于生成一个Html,参数可以是一个字符串.个人认为它不是很快,所以我不怎么经常去用.(我说不经常用它是为了重点突出这句话:请多手动构建 Spannable 来替换 Html.fromHtml),但是它对渲染从 web 上获取的文字还是很不错的. TextView.setError() 在验

随机推荐