您的位置:首页 > 移动开发 > Android开发

Android 开发时候碰到的一些问题

2014-10-27 16:23 531 查看
一、当利用textview显示内容时,显示内容过多可能会折行或显示不全,那样效果很不好。今天发现android api中已经给出自动省略的功能。

实现如下:

源码打印

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:id="@+id/hello"

android:ellipsize="end"

android:singleLine="true"

/>

二、学习]ImageView的scaletype属性

ImageView的属性android:scaleType,即 ImageView.setScaleType(ImageView.ScaleType)。android:scaleType是控制图片如何 resized/moved来匹对ImageView的size。ImageView.ScaleType / android:scaleType值的意义区别:

源码打印

CENTER /center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截 取图片的居中部分显示



CENTER_CROP / centerCrop 按比例扩大图片的size居中显示,使得图片长 (宽)等于或大于View的长(宽)



CENTER_INSIDE / centerInside 将图片的内容完整居中显示,通过按比例缩小 或原来的size使得图片长/宽等于或小于View的长/宽



FIT_CENTER / fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示



FIT_END / fitEnd 把 图片按比例扩大/缩小到View的宽度,显示在View的下部分位置



FIT_START / fitStart 把 图片按比例扩大/缩小到View的宽度,显示在View的上部分位置



FIT_XY / fitXY 把图片 不按比例 扩大/缩小到View的大小显示



MATRIX / matrix 用矩阵来绘制


三、Uri与String之间的转换

Uri u = Uri.parse( "content://media/internal/audio/media/81" );

Android 通过Uri获取Bitmap对象

源码打印

private Bitmap getBitmapFromUri(Uri uri)

{

try

{

// 读取uri所在的图片

Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(), uri);

return bitmap;

}

catch (Exception e)

{

Log.e("[Android]", e.getMessage());

Log.e("[Android]", "目录为:" + uri);

e.printStackTrace();

return null;

}

}

四、Android图片拖动效果(Gallery及ImageAdapter用法)

源码打印

public class Activity01 extends Activity

{

/**

* Gallery类概述(Gallery)此单词翻译过来为画廊,美术馆 一种view,以水平列表的方式显示在屏幕中央 看一眼图片就知道咋回事了

* 此类继承了 AbsSpinner

*/

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

// 获得Gallery对象

Gallery g = (Gallery) findViewById(R.id.Gallery01);

// 添加ImageAdapter给Gallery对象 注意哦Gallery类并没有setAdapter这个方法

// 这个方法是从AbsSpinner类继承的

g.setAdapter(new ImageAdapter(this));

// 设置Gallery的背景图片

g.setBackgroundResource(R.drawable.bg0);

// 设置Gallery的事件监听

g.setOnItemClickListener(new GalleryItemListener());

}



class GalleryItemListener implements OnItemClickListener

{

public void onItemClick(AdapterView<?> parent, View view, int position,

long id) {

Toast.makeText(Activity01.this, ”你选择了” + (position + 1) + ” 号图片”,

Toast.LENGTH_SHORT).show();

}

}

}

ImageAdapter类继承自BaseAdapter类 继承BaseAdapter类就会实现一些方法 这些方法可以用来 设置图片源、获取图片个数、设置显示的方式等等。

源码打印

public class ImageAdapter extends BaseAdapter

{

// 定义Context

private Context mContext;

// 定义整型数组 即图片源

private Integer[] mImageIds =

{ R.drawable.img1, R.drawable.img2, R.drawable.img3, R.drawable.img4,

R.drawable.img5, R.drawable.img6, R.drawable.img7,

R.drawable.img8, };



// 声明ImageAdapter

public ImageAdapter(Context c)

{

mContext = c;

}



// 获取图片的个数

public int getCount()

{

return mImageIds.length;

}



// 获取图片在库中的位置

public Object getItem(int position)

{

return position;

}



// 获取图片ID

public long getItemId(int position)

{

return position;

}



public View getView(int position, View convertView, ViewGroup parent)

{

ImageView imageview = new ImageView(mContext);

// 给ImageView设置资源

imageview.setImageResource(mImageIds[position]);

// 设置布局 图片120*120

imageview.setLayoutParams(new Gallery.LayoutParams(120, 120));

// 设置显示比例类型

imageview.setScaleType(ImageView.ScaleType.FIT_CENTER);

return imageview;

}

}

最后布局文件.

源码打印

<?xml version=”1.0″ encoding=”utf-8″?>

<Gallery xmlns:android=”http://schemas.android.com/apk/res/android”

android:id=”@+id/Gallery01″

android:layout_width=”fill_parent”

android:layout_height=”fill_parent”

android:spacing=”2px”

>

<!– android:spacing=”2px”用来设置图片之间的间距 –>

</Gallery>

五、介绍一个重要方法那就是requestWindowFeature(featrueId),它的功能是启用窗体的扩展特性。参数是Window类中定义的常量。

枚举常量

源码打印

1.DEFAULT_FEATURES:系统默认状态,一般不需要指定

2.FEATURE_CONTEXT_MENU:启用ContextMenu,默认该项已启用,一般无需指定

3.FEATURE_CUSTOM_TITLE:自定义标题。当需要自定义标题时必须指定。如:标题是一个按钮时

4.FEATURE_INDETERMINATE_PROGRESS:不确定的进度

5.FEATURE_LEFT_ICON:标题栏左侧的图标

6.FEATURE_NO_TITLE:吴标题

7.FEATURE_OPTIONS_PANEL:启用“选项面板”功能,默认已启用。

8.FEATURE_PROGRESS:进度指示器功能

9.FEATURE_RIGHT_ICON:标题栏右侧的图标

源码打印

// 隐藏顶部程序名称 写在setContentView(R.layout.xxxx);之前,不然报错

requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);

requestWindowFeature(Window.FEATURE_NO_TITLE);



// 隐藏状态栏

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,

WindowManager.LayoutParams.FLAG_FULLSCREEN);

六、使用MediaStore.Images和 Cursor查询本地图片和图片缩略图

先看一个实例:

源码打印

String[] projection = { MediaStore.Images.Thumbnails._ID ,MediaStore.Images.Thumbnails.DATA};

Cursor cursor = mActivity.getContentResolver().query(

MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,//指定缩略图数据库的Uri

projection,//指定所要查询的字段

MediaStore.Images.Thumbnails._ID + " = ?",//查询条件

new String[] {"123" }, //查询条件中问号对应的值

null);

cursor.moveToFirst();

String id = cursor.getString(0);

String data = cursor.getString(1);



查询图片缩略图数据库,获取id等于123的缩略图信息。

转换成Sql语句即为 select MediaStore.Images.Thumbnails._ID ,MediaStore.Images.Thumbnails.DATA from MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI where MediaStore.Images.Thumbnails._ID = 123



如果要查询图片,Uri地址为:MediaStore.Images.Media.EXTERNAL_CONTENT_URI



当要获取缩略图时:Bitmap bitmap = MediaStore.Images.Thumbnails.getThumbnail (mActivity.getContentResolver(), id, Thumbnails.MICRO_KIND,
null)

(1)读取SD卡上面的图片信息

源码打印

//想要的返回值所在的列

String[] projection = { MediaStore.Images.Thumbnails._ID};

//图片信息存储在 android.provider.MediaStore.Images.Thumbnails数据库

//快速查询数据库中的图片对应存放路劲

Cursor cursor = managedQuery(

MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,

projection, //List of columns to return :想要他返回的列

null, // Return all rows

null,

null);

int columnIndex = cursor.getColumnIndexOrThrow(MediaStore.Images.Thumbnails._ID);

uriArray = new Uri[cursor.getCount()];//把图片路径放在数组中

(2)将读取的图片生成缩略图

源码打印

while(cursor.moveToNext()&&i<cursor.getCount())

{ //移到指定的位置,遍历数据库

cursor.moveToPosition(i);

uri = Uri.withAppendedPath(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI,cursor.getInt(columnIndex)+"");

uriArray[i]=uri;

try {

bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri));

if (bitmap != null) {

//将原来的位图转换成新的位图

newBitmap = Bitmap.createScaledBitmap(bitmap,80, 80,true);

bitmap.recycle();//释放内存

if (newBitmap != null) {

publishProgress(new LoadedImage(newBitmap));

}

}

} catch (IOException e) {}

i++;

}

android在处理一写图片资源的时候,会进行一些类型的转换,现在有空整理一下:



1、Drawable → Bitmap

源码打印

public static Bitmap drawableToBitmap(Drawable drawable) {



Bitmap bitmap = Bitmap

.createBitmap(

drawable.getIntrinsicWidth(),

drawable.getIntrinsicHeight(),

drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888

: Bitmap.Config.RGB_565);

Canvas canvas = new Canvas(bitmap);

//canvas.setBitmap(bitmap);

drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());

drawable.draw(canvas);

return bitmap;

}

2、从资源中获取Bitmap

源码打印

Resources res=getResources();



Bitmap bmp=BitmapFactory.decodeResource(res, R.drawable.pic);

3、Bitmap → byte[]

源码打印

private byte[] Bitmap2Bytes(Bitmap bm){

ByteArrayOutputStream baos = new ByteArrayOutputStream();

bm.compress(Bitmap.CompressFormat.PNG, 100, baos);

return baos.toByteArray();

}

4、 byte[] → Bitmap

源码打印

private Bitmap Bytes2Bimap(byte[] b){

if(b.length!=0){

return BitmapFactory.decodeByteArray(b, 0, b.length);

}

else {

return null;

}

}

七、保存图片到图库

Images.Media.EXTERNAL_CONTENT_URI这是一个系统图片数据表,图库里面的图片数据都是从这里面查询出来的;调用insert就是往这个表里面插入一条数据,插入成功的话,下次加载图库,就可以把新加入的数据从这个表中查询并展示出来了,

源码打印

Images.Media.EXTERNAL_CONTENT_URI:数据表肯定就包括一些属性字段,如下:

values.put(Images.Media.TITLE, title);

values.put(Images.Media.DISPLAY_NAME, filename);

values.put(Images.Media.DATE_TAKEN, dateTaken);

values.put(Images.Media.MIME_TYPE, IMAGE_MIME_TYPE);

values.put(Images.Media.ORIENTATION, degree[0]);

values.put(Images.Media.DATA, filePath);

values.put(Images.Media.SIZE, size);

上面这些内容的键值就是数据表里面的字段,当然这并不是所有的,只是传一些比较重要和常用的保存起来;比如图片的名称、时间、大小、类型等。

八、根据Uri获取文件绝对路径



源码打印

protected String getAbsoluteImagePath(Uri uri)

{

// can post image

String [] proj={MediaStore.Images.Media.DATA};

Cursor cursor = managedQuery( uri,

proj, // Which columns to return

null, // WHERE clause; which rows to return (all rows)

null, // WHERE clause selection arguments (none)

null); // Order-by clause (ascending by name)



int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);

cursor.moveToFirst();



return cursor.getString(column_index);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: