如何在android程序中显示图片
Android基础篇之在ListView中显示网络图片
Android基础篇之在ListView中显示网络图片大家知道ImageView 类虽然有一个setImageUri 方法,但不能直接接受一个由网络地址生成的uri 作为参数从而显示图片,我们只好使用其 setImageBitmap 方法,如view plaincopy to clipboardprint?1.BitmapmBitmap=null;2.3.URLurl=new URL(imageUrl);4.5.HttpURLConnectionconn=(HttpURLConnection)url.openConnection();6.7.InputStream is=conn.getInputStream();8.9.mBitmap=BitmapFactory.decodeStream(is);在SimpleAdapter中需要一个数据源,用来存储数据的,在显示图片时我们要用HashMap<>存储一个Bitmap;但仅存取了Bitmap时在ListView中是无法显示图片的,我们需要对SimpleAdapter进行处理 。
如下是对SimpleAdaptr处理的主要代码:view plaincopy to clipboardprint?1.adapter.setViewBinder(new ViewBinder(){2.3.publicboolean setViewValue(Viewview,Objectdata,4.StringtextRepresentation){5.//判断是否为我们要处理的对象6.if(view instanceof ImageView&&data instanceof Bitmap){7.ImageViewiv=(ImageView)view;8.9.iv.setImageBitmap((Bitmap)data);10.returntrue;11.}else12.returnfalse;13.}14.});看API对Android.widget.SimpleAdapter.ViewBinder的解释:This class can be used by external clients of SimpleAdapter to bind values to views. You should use this class to bind values to views that are not directly supported by SimpleAdapter or to change the way binding occurs for views supported by SimpleAdapter.你可以使用该类来处理SimpleAdapter不直接支持的数据;下面来看看完整的代码:main.xml 中就是一个ListView , list_item.xml 是为ListView中控件提供布局 ,就是一个ImageView。
Andriod游戏开发 第三章 显示文字和图片
第三章显示文字和图片从本章开始,读者就要编写代码了。
按照作者的原则——少一些理论,多一些实践,代码中可能会有跳跃的地方。
但是请大家不要着急,随着学习的深入,你很快就会了解其中的奥秘。
不过在开始之前,我们还是要先来理顺一下思路,看看完成一个坦克大战游戏需要哪些工作:首先,我们需要一个基本的程序,这个程序能够在 Android上运行;这个程序要能够显示图形包括地图,主角和NPC 等等;程序能够接受用户的输入,控制主角移动;程序要能够控制NPC和子弹的移动;程序还能对各种事件做出判断,比如击中敌人,获得物品,胜利或者失败。
现在我们就从基本程序开始,一步一步实现它。
首先,让我们看一下刚刚生成的文件目录在源文件目录下,只有Main.java和R.java两个文件,刚刚被我们命名成Main.java的文件就是程序的入口文件。
而R.java是由插件来维护的资源定义文件,我们先不管它。
Main.java内容如下:package org.yexing.android.games.tank;import android.app.Activity;import android.os.Bundle;public class Main extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);}}很幸运,Main.java的代码非常之少,而且还有一段注释,以致我们很容易知道函数onCreate的作用,需要解释的只是 setContentView()。
先不要管注释中提到的Activity和setContentView的参数yout.main,我们使用setContentView的另一种形式:setContentView(View view)。
Android智能电视APP开发笔记(三)图片加载和显示
TVAPP开发笔记(三)——图像加载和显示1概述更新有点慢了,主要最近事情比较多给耽搁了。
先要对计划开发的APP作个简单的描述:这是一个小学英语学习的APP,主要提供课文的浏览和英文内容朗读的功能,相对来说功能比较简单。
应用场景简单描述如下:进入APP1、进入APP,自动装载对应年级(比如三年级上,三年级下,四年级上,四年级下等)的小学英语课文封面(参见下图1)。
(说明:先按照目前应用商店上的APP的做法,不同年级的课文做成不同的APP,未来可以改为一个APP中包含小学所有年级段英文课文的版本)翻页2、通过手机划屏,或者按界面的“上一页”,“下一页”等按钮可以进行翻页操作,浏览整个英语课文,翻到对应页面,显示对应的页码(如图2,4所示)。
3、点击“页码”可以快捷选择希望进入的页面(如图3所示)。
朗读4、点击“播放”按钮可以播放当前页面的英文内容,根据APP的设置,可以自动只播放当前页面,或者播放所选页面所在Unit,或者播放整篇课文。
5、在朗读状态下,当前页播放完成后,如果是自动朗读下一页的选项,在朗读下一页的同时,页面自动切换到下一页。
6、在朗读状态下,进行翻页操作,自动朗读对应页面的内容;7、在朗读状态下,如果选择“停止”,自动关闭朗读功能;设置8、用户点击“设置”按钮,可以进行朗读模式的设置;退出9、用户选择退出APP,如果在朗读状态,自动停止朗读;主要UI界面如下图所示:图1 图2图3 图4简单对流程进行梳理,界面流程图如下:“上一页”,“下一页”,划屏翻页“上一页”,“下一页”,划屏翻页(TV:“Next ”,”Prev ”键值响应)(TV:“Next ”,”Prev ”键值响应)其中红色部分是针对TV 需要优化的内容,主要对键值响应。
2 图像加载和显示技术通过上述分析,首先要实现英语课本的阅读和翻页功能;英语课本最简单的实现方法是每一页用一个图片来显示,具有图文并茂的好处。
图片的存储方法可以分为两种,一种方法是存在本地,另外一种方法是存在网络,这两种方法各有利弊:1) 存在本地:优点是显示效率高,缺点是本地资源占有较大,而且容易被Copy ,不利于版权保护;2) 存在网络:本地资源占用较少,而且可以进行防Copy ,但是缺点是受网络带宽影响较大,如果手机端网络环境不好,就无法显示;本文中的APP 的图片用来显示英语课本,理论上存在版本问题,存在本地其实不是非常合适,采用网络的方式比较合适,在实际操作中还需要考虑版权保护问题,防止被非法窃取。
如何用Android用ImageView显示本地和网上的图片说明
如何用Android用ImageView显示本地和网上的图片说明Android:ImageView如何显示网络图片本文地址:/programmar/blog/item/79483ecb2ac75cf552664fd3.html在Android中显示一张网络图片其实是超级简单的,下面就一个非常简单的例子:Step1:1、创建你的Activity,本例中以ViewWebImageActivity说明;2、ViewWebImageActivity中的代码如下:String imageUrl = "/baidu/pic/item/7d8aebfebf3f9e125c6008d8.jpg"; //这就是你需要显示的网络图片---网上随便找的Bitmap bmImg;ImageView imView;Button button1;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);imView = (ImageView) findViewById(R.id.imview);imView.setImageBitmap(returnBitMap(imageUrl));}public Bitmap returnBitMap(String url) {URL myFileUrl = null;Bitmap bitmap = null;try {myFileUrl = new URL(url);} catch (MalformedURLException e) {e.printStackTrace();}try {HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();conn.setDoInput(true);conn.connect();InputStream is = conn.getInputStream();bitmap = BitmapFactory.decodeStream(is);is.close();} catch (IOException e) {e.printStackTrace();}return bitmap;}3、其中,returnBitMap(String url) 方法就是具体实现网络图片转换成bitmap。
9_Android基本组件之常用widget组件介绍(图片视图
parent) {
ImageView i = new ImageView(mContext);
i.setImageResource(mThumbIds[position]); i.setAdjustViewBounds(true); i.setLayoutParams(new youtParams(
ImageButton是可以提供一个图片按钮。 这里现在main.xml中添加一个按钮,单击按钮会启动这个 ImageButtonActivity,添加Button的代码如下:
<Button android:id="+id/image_button_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="哥显示的是图片按钮" />
© 2006, ZTE Corporation. All rights reserved.
切换图片(ImageSwitcher&Gallery)介绍与
getView实现代码如下:
应用
public View getView(int position, View convertView, ViewGroup
<Button android:id="+id/image_show_button" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text=“哥显示的是切换图片”/>
android imageview用法
android imageview用法在Android中,ImageView是一个用于显示图像的视图组件。
它可以显示来自各种来源(如本地文件、网络、资源文件等)的图像。
使用ImageView的基本步骤如下:1. 在XML布局文件中添加一个ImageView组件,可以通过以下代码示例添加:```xml<ImageViewandroid:id="@+id/imageView"android:layout_width="match_parent"android:layout_height="match_parent"/>```2. 在Java代码中找到ImageView组件的引用,可以使用以下代码:```javaImageView imageView = findViewById(R.id.imageView);```3. 加载图像到ImageView中。
有多种方式可以加载图像,以下是几个示例:从资源文件加载图像:```javaimageView.setImageResource(R.drawable.my_image);```从网络加载图像(需要在网络请求中获取图像数据后再设置):```java// 获取图像数据后Bitmap bitmap = BitmapFactory.decodeByteArray(imageData, 0, imageData.length);imageView.setImageBitmap(bitmap);```从本地文件加载图像:```javaBitmap bitmap = BitmapFactory.decodeFile(filePath); imageView.setImageBitmap(bitmap);```4. 可选的,对图像进行一些操作,如缩放、裁剪等:```java// 缩放图像imageView.setScaleType(ImageView.ScaleType.CENTER_CROP );// 裁剪图像imageView.setCropToPadding(true);```以上就是基本的ImageView用法,在实际开发中还可以根据需要添加事件监听器、设置其他属性等。
Android 中ImageView 显示图片的几种方法简要分析
try {
stream.close();
} catch (IOException e) {
Log.w("ImageView", "Unable to close content: " +
mUri, e);
}
}
}
} else {
d
= Drawable.createFromPath(mUri.toString());
mDrawableHeight = d.getIntrinsicHeight();
applyColorMod();
configureBounds();
} else {
mDrawableWidth =
mDrawableHeight = -1;
}}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
mResource = 0;
mUri
= uri;
finalint oldWidth = mDrawableWidth;
finalint oldHeight = mDrawableHeight;
resolveUri();
if (oldWidth != mDrawableWidth || oldHeight != mDrawableHeight) {
finalint oldHeight
= mDrawableHeight;
updateDrawable(drawable);
if (oldWidth != mDrawableWidth ||
oldHeight != mDrawableHeight) {
requestLayout();
Android中高效的显示图片 - 加载大图
Android中高效的显示图片 - 加载大图Android开发者应该对上面这个错误都不陌生。
Android系统对每个应用使用的内存是有限制的,一旦应用使用的总内存超过这个阀值,系统就会抛出上面的错误导致应用crash。
内存溢出的错误是开发者必须要解决的,根据经验来说,内存溢出很多场景都是由图片资源使用不当引起的。
Android官方的开发者文档中也有专门的文章来介绍这个问题。
高效的加载高分辨率的图片我们以加载Galaxy Nexus拍摄的照片为例。
500万的摄像头拍摄的照片分辨率为2592x1936像素,如果我们使用ARGB_8888设置(android 2.3以后的默认设置,这种设置规定用四个字节来存储一个像素值)来加载这张图片,它将占用19M的内存(2592*1936*4字节)。
在某些限制每个应用最多使用16M内存的手机上,这一张图片就会导致内存溢出。
出现这种情况怎么办呢?冷静分析我们会发现在手机上展示图片时我们并不需要这么高分辨率的图片。
比如在屏幕分辨率为1920x1080的手机上,即使你要展示图片的imageview充满了整个屏幕,也最多需要1920x1080的图片,更高分辨率的图片对我们的展示效果并没有提升,只会白白浪费我们宝贵的内存空间。
所以对这种加载高分辨率的图片情况我们应该加载一个低分辨率版本的图片到内存中。
接下来我们看下具体的操作步骤。
加载图片尺寸和类型针对不同的图片数据来源,BitmapFactory提供了不同的解码方法(decodeResource()、decodeFile()...),这些方法在构造图片的时候会申请相应的内存空间,所以它们经常抛出内存溢出的异常。
这些方法都允许传入一个BitmapFactory.Options类型的参数来获取将要构建的图片的属性。
如果将inJustDecodeBounds的值设置成true,这些方法将不会真正的创建图片,也就不会占用内存,它们的返回值将会是空。
Android读取assets目录下的所有图片并显示的方法
Android读取assets⽬录下的所有图⽚并显⽰的⽅法本⽂实例讲述了Android读取assets⽬录下的所有图⽚并显⽰的⽅法。
分享给⼤家供⼤家参考。
具体⽅法分析如下:在assets⽂件夹⾥⾯的⽂件都是保持原始的⽂件格式,需要⽤AssetManager以字节流的形式读取⽂件。
1. 先在Activity⾥⾯调⽤getAssets() 来获取AssetManager引⽤。
2. 再⽤AssetManager的open(String fileName, int accessMode) ⽅法则指定读取的⽂件以及访问模式就能得到输⼊流InputStream。
3. 然后就是⽤已经open file 的inputStream读取⽂件,读取完成后记得inputStream.close() 。
4.调⽤AssetManager.close() 关闭AssetManager。
需要注意的是,来⾃Resources和Assets 中的⽂件只可以读取⽽不能进⾏写的操作。
下⾯看⼀下在Activity中使⽤的⽰例代码:复制代码代码如下:List<Map<String, Object>> cateList = new ArrayList<Map<String, Object>>();String[] list_image = null;try {//得到assets/processedimages/⽬录下的所有⽂件的⽂件名,以便后⾯打开操作时使⽤list_image = context.getAssets().list("processedimages");} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}for(int i=0;i<list_image.length;++i){InputStream open = null;try {String temp = "processedimages/"+list_image[i];open = context.getAssets().open(temp);Bitmap bitmap = BitmapFactory.decodeStream(open);Map<String, Object> map = new HashMap<String, Object>();map.put("name", list_image[i]);map.put("iv", bitmap);map.put("bg", R.drawable.phone_vip_yes);map.put("cate_id",i);cateList.add(map);// Assign the bitmap to an ImageView in this layout} catch (IOException e) {e.printStackTrace();} finally {if (open != null) {try {open.close();} catch (IOException e) {e.printStackTrace();}}}}这样所有的map中的关键字“iv"处理论上就保存了我们读取的bitmap,可以结果并⾮如此,⼤家应该注意到了在”bg“关键字处我们也保存了⼀个图⽚,只不过它是通过R.drawable.⽅式获取的,实验证明这种⽅式是可以成功读取并显⽰的。
Android用ImageView显示本地和网上的图片
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
n *= 2;
}
return (int) n;
}
}
2.在Activity上显示图片。
import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;
public classMainActivity extends Activity {
map = BitmapFactory.decodeFile(file.getAbsolutePath(),opts);
} catch (Exception e) {
e.printStackTrace();
}
return map;
}
private static int findBestSampleSize(int actualWidth, int actualHeight, int desiredWidth, int desiredHeight) {
super.onCreate(savedInstanceState);
setContentView(yout.activity_main);
iv = (ImageView) this.findViewById(R.id.image);
如何在android程序中显示图片
我们做Android 程序的时候,有时候需要显示图片在界面上,这里我们将实现一个将图片展示到手机屏幕,并让其不停的浮动的效果!首先我们要先准备一张图片,在这里我准备了一张图片,如下:将此图片放到文件夹"res->drawable-*dpi"下,记得,三个文件夹都要放,因为系统会根据不同的分辨率去取不同的图片,如果有的没放,在某些分辨率下,会找不到资源。
将此图片重命名为“pic.png”,在R.java里的drawable类里会生成一个pic的常量。
图片要显示,就是要容器可以让其显示,因为所有的Android 的UI组件都是继承自View,View也实现了Drawable接口,所以在此,我们也重新定义一个View让其用来显示我们的这张图片,并让这张图片浮动。
我们创建一个在包“org.leo.bitmap”下的,类名为“MovingPictureView”的类,该类继承自android.view.View。
此类目前代码大致如下:public class MovingPictureView extends View {public MovingPictureView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);}}我们要重载他的“onDraw”方法,这个方法就是Android框架展现View的时候用来绘制显示内容那个的方法。
在此我们将他的所有方法体都删除掉(上面代码红色部分删掉),完全将其重写。
首先我们要创建一个图片对象,在Android里,所有位图图片都是使用Bitmap类来封装的,我们就先声明一个代表我们刚才图片的一个Bitmap对象,可通过以下方式声明:Bitmap bitmap =BitmapFactory.decodeResource(getResources(), R.drawable.pic);其中的“getResources()”方法,是有View提供的,可以根据此方法获得我们所有的资源,将来有机会再细说!有了bitmap对象,下一步就是将图片画到我们自己的View上了,看上面的“onDraw”方法,其中的参数是“Canvas”对象,其实就是提供了一个画板,有了画板我们就能画任何我们想画的东西了。
在ANDROID系统如何显示一幅图
在ANDROID系统如何显示一幅图ANDROID是GOOLGE公司推出的基于LINUX的一款手机嵌入式操作系统。
它由以下几部分构成:1)一个参考的硬件设计2)一个LINUX操作系统内核它提供了与硬件之间的低级接口,内存管理和进程控制,并且全部都为移动设备做了优化。
3)应用程序开发的开源库,包括SQLite,WebKit OpenGL以及一个媒体管理器。
4)Davik虚拟机和提供ANDROID特定功能的核心库,用来承载和运行ANDROID应用程序。
5)应用程序框架,包括窗口管理器,内容提供器,电话和点对点服务。
6)用户接口框架7)预装应用程序8)应用程序软件开发包,包括:工具、插件,文档。
下面给出将一幅图全屏显示出来所需的源代码:package com.sxunicom;import android.app.Activity;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.os.Bundle;import android.os.SystemClock;import android.util.DisplayMetrics;import android.widget.AbsoluteLayout;import android.widget.ImageView;import android.widget.TextView;public class welcome_activity extends Activity {private boolean is_first;private Bitmap myBitmap,resizeBmp;int screen_width,screen_height;public int welcome_activity(){return 0;}public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//获取屏幕大小DisplayMetrics dm=new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);screen_width=dm.widthPixels;screen_height=dm.heightPixels;AbsoluteLayout al=new AbsoluteLayout(this);//创建显示图片的窗口WelcomeView myImageView1=new WelcomeView(this,screen_width,screen_height); //加入绝对坐标布局al.addView(myImageView1,new youtParams(screen_width,screen_height,0,0));//加入当前活动setContentView(al);}}另外一个文件是package com.sxunicom;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.Paint;import android.view.*;public class WelcomeView extends View {private int screen_width,screen_height;private Bitmap myBitmap,resizeBmp;public WelcomeView(Context context,int screen_width1,int screen_height1) {super(context);// TODO Auto-generated constructor stubscreen_width=screen_width1;screen_height=screen_height1;}protected void onDraw(Canvas canvas){//获取显示图片myBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.welcome);Matrix matrix=new Matrix();float scale_width=((float)screen_width)/(float)myBitmap.getWidth();float scale_height=((float)screen_height)/(float)myBitmap.getHeight();matrix.postScale(scale_width, scale_height);//根据屏幕调整位图resizeBmp=Bitmap.createBitmap(myBitmap,0,0,myBitmap.getWidth(),myBitmap.getHeight (),matrix,true);Paint myPaint=new Paint();//画图canvas.drawBitmap(resizeBmp, 0,0, myPaint); }}。
Android实现选择相册图片并显示功能
Android实现选择相册图⽚并显⽰功能本⽂实例为⼤家分享了Android实现选择相册图⽚并显⽰的具体代码,供⼤家参考,具体内容如下需求描述:选择⼿机相册中的⼀张图⽚,并通过ImageView展⽰出来参考博⽂:效果展⽰:⽰例代码:MainActivitypackage com.example.www.mutilmedia;import android.Manifest;import android.app.Activity;import android.content.Intent;import android.content.pm.PackageManager;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.Build;import android.os.Bundle;import android.support.annotation.NonNull;import android.support.v4.app.ActivityCompat;import android.support.v7.app.AppCompatActivity;import android.util.Log;import android.view.View;import android.widget.ImageView;import android.widget.Toast;import java.util.Arrays;public class MainActivity extends AppCompatActivity {String[] mPermissionList = new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,Manifest.permission.READ_EXTERNAL_STORAGE};public static final int REQUEST_PICK_IMAGE = 11101;private ImageView mShowImg;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);mShowImg = (ImageView) findViewById(R.id.imageView);}@Overridepublic void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {super.onRequestPermissionsResult(requestCode, permissions, grantResults);switch (requestCode) {case 100:boolean writeExternalStorage = grantResults[0] == PackageManager.PERMISSION_GRANTED;boolean readExternalStorage = grantResults[1] == PackageManager.PERMISSION_GRANTED;Log.e("MainActivity", Arrays.toString(grantResults));if (grantResults.length > 0 && writeExternalStorage && readExternalStorage) {getImage();} else {Toast.makeText(this, "请设置必要权限", Toast.LENGTH_SHORT).show();}break;}}private void getImage() {if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) {startActivityForResult(new Intent(Intent.ACTION_GET_CONTENT).setType("image/*"),REQUEST_PICK_IMAGE);} else {Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);intent.addCategory(Intent.CATEGORY_OPENABLE);intent.setType("image/*");startActivityForResult(intent, REQUEST_PICK_IMAGE);}}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);if (resultCode == Activity.RESULT_OK) {switch (requestCode) {case REQUEST_PICK_IMAGE:if (data != null) {String realPathFromUri = RealPathFromUriUtils.getRealPathFromUri(this, data.getData()); Log.e("MainActivity", realPathFromUri);showImg(realPathFromUri);} else {Toast.makeText(this, "图⽚损坏,请重新选择", Toast.LENGTH_SHORT).show();}break;}}}public void openCamera(View view) {ActivityCompat.requestPermissions(MainActivity.this, mPermissionList, 100);}public void showImg(String path){Bitmap bitmap = BitmapFactory.decodeFile(path);mShowImg.setImageBitmap(bitmap);}}RealPathFromUriUtilspackage com.example.www.mutilmedia;import android.annotation.SuppressLint;import android.content.ContentUris;import android.content.Context;import android.database.Cursor;import .Uri;import android.os.Build;import android.provider.DocumentsContract;import android.provider.MediaStore;public class RealPathFromUriUtils {/*** 根据Uri获取图⽚的绝对路径** @param context 上下⽂对象* @param uri 图⽚的Uri* @return 如果Uri对应的图⽚存在, 那么返回该图⽚的绝对路径, 否则返回null*/public static String getRealPathFromUri(Context context, Uri uri) {int sdkVersion = Build.VERSION.SDK_INT;if (sdkVersion >= 19) { // api >= 19return getRealPathFromUriAboveApi19(context, uri);} else { // api < 19return getRealPathFromUriBelowAPI19(context, uri);}}/*** 适配api19以下(不包括api19),根据uri获取图⽚的绝对路径** @param context 上下⽂对象* @param uri 图⽚的Uri* @return 如果Uri对应的图⽚存在, 那么返回该图⽚的绝对路径, 否则返回null*/private static String getRealPathFromUriBelowAPI19(Context context, Uri uri) {return getDataColumn(context, uri, null, null);}/*** 适配api19及以上,根据uri获取图⽚的绝对路径** @param context 上下⽂对象* @param uri 图⽚的Uri* @return 如果Uri对应的图⽚存在, 那么返回该图⽚的绝对路径, 否则返回null*/@SuppressLint("NewApi")private static String getRealPathFromUriAboveApi19(Context context, Uri uri) {String filePath = null;if (DocumentsContract.isDocumentUri(context, uri)) {// 如果是document类型的 uri, 则通过document id来进⾏处理String documentId = DocumentsContract.getDocumentId(uri);if (isMediaDocument(uri)) { // MediaProvider// 使⽤':'分割String id = documentId.split(":")[1];String selection = MediaStore.Images.Media._ID + "=?";String[] selectionArgs = {id};filePath = getDataColumn(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI, selection, selectionArgs);} else if (isDownloadsDocument(uri)) { // DownloadsProviderUri contentUri = ContentUris.withAppendedId(Uri.parse("content://downloads/public_downloads"), Long.valueOf(documentId)); filePath = getDataColumn(context, contentUri, null, null);}} else if ("content".equalsIgnoreCase(uri.getScheme())) {// 如果是 content 类型的 UrifilePath = getDataColumn(context, uri, null, null);} else if ("file".equals(uri.getScheme())) {// 如果是 file 类型的 Uri,直接获取图⽚对应的路径filePath = uri.getPath();}return filePath;}/*** 获取数据库表中的 _data 列,即返回Uri对应的⽂件路径** @return*/private static String getDataColumn(Context context, Uri uri, String selection, String[] selectionArgs) {String path = null;String[] projection = new String[]{MediaStore.Images.Media.DATA};Cursor cursor = null;try {cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null);if (cursor != null && cursor.moveToFirst()) {int columnIndex = cursor.getColumnIndexOrThrow(projection[0]);path = cursor.getString(columnIndex);}} catch (Exception e) {if (cursor != null) {cursor.close();}}return path;}/*** @param uri the Uri to check* @return Whether the Uri authority is MediaProvider*/private static boolean isMediaDocument(Uri uri) {return "com.android.providers.media.documents".equals(uri.getAuthority());}/*** @param uri the Uri to check* @return Whether the Uri authority is DownloadsProvider*/private static boolean isDownloadsDocument(Uri uri) {return "com.android.providers.downloads.documents".equals(uri.getAuthority());}}activity_main.xml<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="/apk/res/android" xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ImageViewandroid:id="@+id/imageView"android:layout_width="0dp"android:layout_height="0dp"android:layout_marginStart="8dp"android:layout_marginTop="8dp"android:layout_marginEnd="8dp"android:layout_marginBottom="8dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/button3"app:srcCompat="@android:color/white" /><Buttonandroid:id="@+id/button3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginStart="8dp"android:layout_marginTop="16dp"android:layout_marginEnd="8dp"android:onClick="openCamera"android:text="camera"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintHorizontal_bias="0.048"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /></android.support.constraint.ConstraintLayout>AndroidManifest.xml<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.example.www.mutilmedia"><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /></intent-filter></activity></application></manifest>以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Android实现轮播图片展示效果
Android实现轮播图⽚展⽰效果本⽂实例为⼤家分享了Android轮播图⽚的展⽰,供⼤家参考,具体内容如下实现逻辑1.创建XML布局⽂件,使⽤ViewPager完成轮播图⽚2.初始化ViewPager控件,然后为控件设置适配器,创建出来的适配器实现⾥⾯的四个⽅法3.四个⽅法分别是getCount isViewFromObject instantiateItem destroyItem4.在onCreat⽅法中,加载图⽚资源,将图⽚ID存在集合中,使图⽚能够在页⾯中显⽰,(图⽚之所以能够在页⾯中显⽰,是因为在适配器中的instantiateItem⽅法中获取了集合中的图⽚元素)5.图⽚下⽅的⽂字显⽰:图⽚下⽅之所以会有⽂字,可以通过初始化控件,在ViewPager监听器中的onPageSelected⽅法中tv_desc.setText(descs[position]);这样⽂字就可以跟随者图⽚进⾏切换6.⽂字下⽅的⼩圆点的切换:在XML布局中设置⼀个Linlayout布局,然后再onCreat⽅法中设置⼩圆点,通过youtParams layoutParams = new youtParams(10, 10);的⽅法引⼊⼩圆点(具体代码可以参考下⽅的initDot⽅法)7.要想让⼩圆点随着页⾯的切换⽽切换,可以定义下⽅的changeDots的⽅法,让此⽅法在监听器中的onPageSelected⽅法中进⾏调⽤8.图⽚的⽆限轮播的实现:可以使适配器中的getCount返回值设为⼀个很⼤很⼤的值,同时在instantiateItem⽅法中设置position position = position % imageResIds.length;防⽌索引越界异常,这样就可以使图⽚⽆限轮播,但是此时还有⼀个问题就是,右边可以⽆限轮播,但是左边是⽆法⽆限轮播的,这个问题的解决办法是在onCreat⽅法中设置当前选中的条⽬viewPager.setCurrentItem(count / 2);这样两边都可以实现⽆限轮播9.图⽚⾃动切换的处理:使⽤handler机制实现页⾯的延时更新,同时为了防⽌内存溢出,需要在页⾯可见时,也就是activity的onStart⽅法中发送消息,在页⾯消失时,也就是onStop⽅法中删除消息布局⽂件<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:id="@+id/activity_main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context="com.example.a2_.MainActivity"><android.support.v4.view.ViewPagerandroid:id="@+id/vp"android:layout_width="match_parent"android:layout_height="250dp"></android.support.v4.view.ViewPager><LinearLayoutandroid:orientation="vertical"android:gravity="center"android:background="#66000000"android:layout_alignBottom="@id/vp"android:layout_width="match_parent"android:layout_height="50dp"><TextViewandroid:id="@+id/desc"android:text="描述⽂本"android:textColor="#ffffff"android:layout_width="wrap_content"android:layout_height="wrap_content" /><LinearLayoutandroid:id="@+id/layout_dot"android:orientation="horizontal"android:layout_width="wrap_content"android:layout_height="wrap_content"></LinearLayout></LinearLayout></RelativeLayout>核⼼代码package com.example.a2_;import android.os.Handler;import android.os.Message;import android.support.v4.view.PagerAdapter;import android.support.v4.view.ViewPager;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import java.util.ArrayList;public class MainActivity extends AppCompatActivity {private static final int UPDATE_ITEM = 1;private ArrayList<ImageView> imageViews = new ArrayList<>();private int[] imageResIds = {R.mipmap.icon_1, R.mipmap.icon_2, R.mipmap.icon_3,R.mipmap.icon_4, R.mipmap.icon_5};private String[] descs = {"为梦想坚持", "我相信我是⿊马", "⿊马公开课", "Google/IO", "轻松1w+"}; private ViewPager viewPager;private TextView tv_desc;private LinearLayout layout_dot;private int count = 10000000;private Handler handler = new Handler() {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {case UPDATE_ITEM:upDataItem();break;}super.handleMessage(msg);}};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);//初始化控件viewPager = (ViewPager) findViewById(R.id.vp);tv_desc = (TextView) findViewById(R.id.desc);layout_dot = (LinearLayout) findViewById(yout_dot);//给viewPager设置适配器viewPager.setAdapter(new MyPagerAdapter());//对viewPager设置监听器viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {//当页⾯滚动时触发的时间@Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}//当页⾯被选中时触发的⽅法@Overridepublic void onPageSelected(int position) {//对position进⾏处理position = position % imageViews.size();//当页⾯被选中的时候,改变描述⽂本tv_desc.setText(descs[position]);changeDots(position);}//当页⾯状态滚动状态发⽣改变时触发的事件@Overridepublic void onPageScrollStateChanged(int state) {//当页⾯空闲状态被改变的时候if (state == viewPager.SCROLL_STATE_IDLE) {handler.sendEmptyMessageDelayed(UPDATE_ITEM, 3000);} else {handler.removeMessages(UPDATE_ITEM);}}});//初始化图⽚initImage();//初始化⽂字下⽅的点initDot();//当加载页⾯的时候,默认让第⼀个⽂本加载出来// initDescFirst();//使两边都可以⽆限轮播viewPager.setCurrentItem(count / 2);//页⾯加载时更新upDataItem();}private void upDataItem() {int index = viewPager.getCurrentItem();viewPager.setCurrentItem(++index);handler.sendEmptyMessageDelayed(UPDATE_ITEM, 3000);}//选中对应的原点private void changeDots(int position) {//先把所有的点恢复为⽩⾊for (int i = 0; i < layout_dot.getChildCount(); i++) {View view = layout_dot.getChildAt(i);view.setSelected(false);}//获取当前被选中的条⽬设置为选中状态layout_dot.getChildAt(position).setSelected(true);}//初始化⽂字下⽅的点private void initDot() {youtParams layoutParams = new youtParams(10, 10); layoutParams.setMargins(4, 4, 4, 4);for (int i = 0; i < imageViews.size(); i++) {View view = new View(this);view.setBackgroundResource(R.drawable.seletor_dot);view.setLayoutParams(layoutParams);layout_dot.addView(view);}}//当加载页⾯的时候,默认让第⼀个⽂本加载出来private void initDescFirst() {tv_desc.setText(descs[0]);changeDots(0);}//添加图⽚,准备⼀个ImageView集合,⽤来交给instantiateItem添加到页⾯private void initImage() {for (int i = 0; i < imageResIds.length; i++) {//创建出ImageView对象ImageView imageView = new ImageView(getApplicationContext());imageView.setImageResource(imageResIds[i]);imageViews.add(imageView);}}private class MyPagerAdapter extends PagerAdapter {@Overridepublic int getCount() {return count;}@Overridepublic boolean isViewFromObject(View view, Object object) {//判断这个view是不是通过instantiateItem创建出来的return view == object;}//⽤来创建条⽬@Overridepublic Object instantiateItem(ViewGroup container, int position) {position = position % imageResIds.length;//获取条⽬ImageView imageView = imageViews.get(position);container.addView(imageView);return imageView;}//⽤来销毁条⽬,,且最多会创建出三个条⽬,多出来的条⽬将会被销毁@Overridepublic void destroyItem(ViewGroup container, int position, Object object) {//销毁创建的条⽬container.removeView((View) object);}}@Overrideprotected void onStart() {super.onStart();//当页⾯显⽰的时候,更新轮播图handler.sendEmptyMessageDelayed(UPDATE_ITEM, 3000);}@Overrideprotected void onStop() {super.onStop();//当页⾯不可见时,停⽌更新handler.removeCallbacksAndMessages(null);}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
安卓(Android)ListView显示图片文字
安卓(Android)ListView显⽰图⽚⽂字⼀.代码实现1. “Activity_11\src\yan\activity_11\MainActivity.java”package yan.activity_11;import android.os.Bundle;import android.app.Activity;import android.content.Context;import youtInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity {ListView listView;String [] titles={"标题1","标题2","标题3","标题4"};String [] texts={"⽂本内容A","⽂本内容B","⽂本内容C","⽂本内容D"};int [] resIds={R.drawable.icon,R.drawable.icon,R.drawable.icon,R.drawable.icon};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);this.setTitle("BaseAdapter for ListView");listView=(ListView)this.findViewById(R.id.MyListView);listView.setAdapter(new ListViewAdapter(titles,texts,resIds));}public class ListViewAdapter extends BaseAdapter{View [] itemViews;public ListViewAdapter(String [] itemTitles, String [] itemTexts,int [] itemImageRes){itemViews = new View[itemTitles.length];for (int i=0; i<itemViews.length; ++i){itemViews[i] = makeItemView(itemTitles[i], itemTexts[i],itemImageRes[i]);}}public int getCount() {return itemViews.length;}public View getItem(int position) {return itemViews[position];}public long getItemId(int position) {return position;}private View makeItemView(String strTitle, String strText, int resId) {LayoutInflater inflater = (LayoutInflater)MainActivity.this.getSystemService(YOUT_INFLATER_SERVICE);// 使⽤View的对象itemView与yout.item关联View itemView = inflater.inflate(yout.listview_item, null);// 通过findViewById()⽅法实例yout.item内各组件TextView title = (TextView)itemView.findViewById(R.id.itemTitle);title.setText(strTitle);TextView text = (TextView)itemView.findViewById(R.id.itemText);text.setText(strText);ImageView image = (ImageView)itemView.findViewById(R.id.itemImage);image.setImageResource(resId);return itemView;}public View getView(int position, View convertView, ViewGroup parent) {if (convertView == null)return itemViews[position];return convertView;}}}2.package yan.activity_11;import android.os.Bundle;import android.app.Activity;import android.content.Context;import youtInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity {ListView listView;String [] titles={"标题1","标题2","标题3","标题4"};String [] texts={"⽂本内容A","⽂本内容B","⽂本内容C","⽂本内容D"};int [] resIds={R.drawable.icon,R.drawable.icon,R.drawable.icon,R.drawable.icon}; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);this.setTitle("BaseAdapter for ListView");listView=(ListView)this.findViewById(R.id.MyListView);listView.setAdapter(new ListViewAdapter(titles,texts,resIds));}public class ListViewAdapter extends BaseAdapter{View [] itemViews;public ListViewAdapter(String [] itemTitles, String [] itemTexts,int [] itemImageRes){itemViews = new View[itemTitles.length];for (int i=0; i<itemViews.length; ++i){itemViews[i] = makeItemView(itemTitles[i], itemTexts[i],itemImageRes[i]);}}public int getCount() {return itemViews.length;}public View getItem(int position) {return itemViews[position];}public long getItemId(int position) {return position;}private View makeItemView(String strTitle, String strText, int resId) {LayoutInflater inflater = (LayoutInflater)MainActivity.this.getSystemService(YOUT_INFLATER_SERVICE);// 使⽤View的对象itemView与yout.item关联View itemView = inflater.inflate(yout.listview_item, null);// 通过findViewById()⽅法实例yout.item内各组件TextView title = (TextView)itemView.findViewById(R.id.itemTitle);title.setText(strTitle);TextView text = (TextView)itemView.findViewById(R.id.itemText);text.setText(strText);ImageView image = (ImageView)itemView.findViewById(R.id.itemImage); image.setImageResource(resId);return itemView;}public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null)return itemViews[position];return convertView;}}}⼆.“Activity_11\res\layout\main.xml”<?xml version="1.0" encoding="utf-8"?><LinearLayoutandroid:id="@+id/LinearLayout01"android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="/apk/res/android"><ListView android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/MyListView"></ListView></LinearLayout><?xml version="1.0" encoding="utf-8"?><LinearLayoutandroid:id="@+id/LinearLayout01"android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="/apk/res/android"><ListView android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/MyListView"></ListView></LinearLayout>三.“Activity_11\res\layout\listview_item.xml”<?xml version="1.0" encoding="utf-8"?><RelativeLayoutandroid:layout_width="fill_parent"xmlns:android="/apk/res/android"android:layout_height="wrap_content"android:paddingBottom="4dip"android:paddingLeft="12dip"><ImageViewandroid:layout_width="wrap_content"android:id="@+id/itemImage"android:layout_height="fill_parent"></ImageView><TextViewandroid:text="TextView01"android:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/itemTitle"android:layout_toRightOf="@+id/itemImage"android:textSize="20dip"></TextView><TextViewandroid:text="TextView02"android:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/itemText"android:layout_toRightOf="@+id/itemImage"android:layout_below="@+id/itemTitle"></TextView></RelativeLayout><?xml version="1.0" encoding="utf-8"?><RelativeLayoutandroid:layout_width="fill_parent"xmlns:android="/apk/res/android" android:layout_height="wrap_content"android:paddingBottom="4dip"android:paddingLeft="12dip"><ImageViewandroid:layout_width="wrap_content"android:id="@+id/itemImage"android:layout_height="fill_parent"></ImageView><TextViewandroid:text="TextView01"android:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/itemTitle"android:layout_toRightOf="@+id/itemImage"android:textSize="20dip"></TextView><TextViewandroid:text="TextView02"android:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/itemText"android:layout_toRightOf="@+id/itemImage"android:layout_below="@+id/itemTitle"></TextView></RelativeLayout>。
AndroidListView实现图文列表显示
AndroidListView实现图⽂列表显⽰本⽂实例为⼤家分享了Android ListView实现图⽂列表显⽰的具体代码,供⼤家参考,具体内容如下⽬标效果:ListView如果内容过多,可以滑动屏幕来显⽰,并且点击某⼀⾏可使⽤吐司⽅法弹出对应的⽔果名字。
1.新建项⽬,新建entity实体类包,包中建存储每⾏⽔果信息的Fruit类。
Fruit.java页⾯:package com.example.entity;public class Fruit {private int imageId; //使⽤id锁定⽔果图⽚private String imageName; //对应的⽔果名字public Fruit(int imageId, String imageName) {super();this.imageId = imageId;this.imageName = imageName;}public int getImageId() {return imageId;}public void setImageId(int imageId) {this.imageId = imageId;}public String getImageName() {return imageName;}public void setImageName(String imageName) {this.imageName = imageName;}}2.在activity_main.xml页⾯添加ListView控件,⽤于显⽰所有的⽔果即⽔果名称。
activity_main.xml页⾯:<RelativeLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/lvFruits"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentLeft="true"android:layout_alignParentTop="true" ></ListView></RelativeLayout>3.⼀个ListView中有多⾏信息,每⾏信息可以看成⼀个LinearLayout⼦布局,⼦布局中有两个控件ImageView和TextView,按照⽔平排列。
Android图片保存到相册不显示的解决方案(兼容Android10及更高版本)
Android图⽚保存到相册不显⽰的解决⽅案(兼容Android10及更⾼版本)⽬录前⾔问题解决问题前⾔写了⼀个demo,简单逻辑就是:在⼀个图⽚上添加⼀⾏⽂字或者是⽔印,并且保存到系统相册,也就是我们⼿机上的图库。
前⾯编辑图⽚添加⽔印都没有问题,到后⾯保存到系统相册出现了问题:显⽰不出来图⽚。
问题在 Android 10 之前保存系统相册的三步骤:保存图⽚到⼿机把图⽚插⼊到⼿机图库发⼴播更新代码如下:public static void savePhotoAlbum(Context context, Bitmap bmp) {// ⾸先保存图⽚File appDir = new File(Environment.getExternalStorageDirectory(), "Boohee");if (!appDir.exists()) {appDir.mkdir();}String fileName = System.currentTimeMillis() + ".jpg";File file = new File(appDir, fileName);try {FileOutputStream fos = new FileOutputStream(file);press(CompressFormat.JPEG, 100, fos);fos.flush();fos.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 其次把⽂件插⼊到系统图库try {MediaStore.Images.Media.insertImage(context.getContentResolver(),file.getAbsolutePath(), fileName, null);} catch (FileNotFoundException e) {e.printStackTrace();}// 最后通知图库更新context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + path)));}出现的问题:图⽚不显⽰,也就是说没有更新到系统图库中。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
我们做Android 程序的时候,有时候需要显示图片在界面上,这里我们将实现一个将图片展示到手机屏幕,并让其不停的浮动的效果!
首先我们要先准备一张图片,在这里我准备了一张图片,如下:
将此图片放到文件夹"res->drawable-*dpi"下,记得,三个文件夹都要放,因为系统会根据不同的分辨率去取不同的图片,如果有的没放,在某些分辨率下,会找不到资源。
将此图片重命名为“pic.png”,在R.java里的drawable类里会生成一个pic的常量。
图片要显示,就是要容器可以让其显示,因为所有的Android 的UI组件都是继承自View,View也实现了Drawable接口,所以在此,我们也重新定义一个View让其用来显示我们的这张图片,并让这张图片浮动。
我们创建一个在包“org.leo.bitmap”下的,类名为“MovingPictureView”的类,该类继承自android.view.View。
此类目前代码大致如下:
public class MovingPictureView extends View {
public MovingPictureView(Context context) {
super(context);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
}
我们要重载他的“onDraw”方法,这个方法就是Android框架展现View的时候用来绘制显示内容那个的方法。
在此我们将他的所有方法体都删除掉(上面代码红色部分删掉),完全将其重写。
首先我们要创建一个图片对象,在Android里,所有位图图片都是使用Bitmap类来封装的,我们就先声明一个代表我们刚才图片的一个Bitmap对象,可通过以下方式声明:
Bitmap bitmap =
BitmapFactory.decodeResource(getResources(), R.drawable.pic);
其中的“getResources()”方法,是有View提供的,可以根据此方法获得我们所有的资源,将来有机会再细说!
有了bitmap对象,下一步就是将图片画到我们自己的View上了,看上面的“onDraw”方法,其中的参数是“Canvas”对象,其实就是提供了一个画板,有了画板我们就能画任何我们想画的东西了。
可以通过调用canvas
的方法将图片画到画板上:
canvas.drawBitmap(bitmap, 0, 0, null);其中的参数分别是“Bitmap对象,Left距离左边界坐标,Top距离上边界坐标,Paint对象”其中的Paint对象,可以做一些额外设置,比如我们要画文字到画板上,就可以通过paint设置其大小,颜色,等,也可以设置透明度(即Alpha值)。
画图片也可以通过Paint设置其Alpha值,在此我们不演示了,直接传一个空进去。
通过以上的方式,就可以将图片显示在屏幕上,不过当前我们要修改一下默认Activity的代码,让我们一启动就能看到我们自定义的显示图片的View。
在这里我们还是用我们Helloworld实例中的Activity(HelloAndroid)打开此类,将方法“public void onCreate(Bundle savedInstanceState)”中的内容改为如下:
super.onCreate(savedInstanceState);
setContentView(new MovingPictureView(this));
即将当前显示的View设置为我们自定义的View。
运行此工程,就会看到如下图所示结果:
图片显示在左上角,现在图片是显示出来了,下一步,我们要让其自动浮动。
可以通过不停的改变图片的Left,Top值,再重新画图片达到此效果,如何重画图片呢?View给我们提供了一个名字为“invalidate()”的方法,只要调用此方法,View就会重新调用onDraw方法,重绘该View内容。
另外我们创建一个线程,来不停的变换图片的Left,Top值,调用invalidate方法重绘View。
实现的全部代码大致如下:
public class MovingPictureView extends View implements Runnable{
//用于显示的图片
Bitmap bitmap;
//图片坐标转化的线程是否运行,false,则停止运行
boolean isRuning = true;
//图片的Lfet,Top值
int left = 0;
int top = 0;
//用于同步线程
Handler handler;
//向量,可以通过调节此两个变量调节移动速度
int dx = 1;
int dy = 1;
public MovingPictureView(Context context) {
super(context);
bitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.pic);
handler = new Handler();
new Thread(this).start();
}
@Override
protected void onDraw(Canvas canvas) {
//将图画到画板上
canvas.drawBitmap(bitmap, left,top, null);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
isRuning = false;//当点击屏幕,则将图片浮动停止
return true;
}
@Override
public void run() {
while(isRuning){
//通过调节向量,来控制方向
dx = left < 0 || left > (getWidth() - bitmap.getWidth()) ? -dx : dx;
dy = top < 0 || top > (getHeight() - bitmap.getHeight()) ? -dy : dy;
left = left+dx;
top = top+dy;
handler.post(new Runnable() {
@Override
public void run() {
invalidate();
}
});
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
其中的“handler”是用于线程同步,因为在其他线程中,是不允许直接访问view 所在线程中的view对应资源的,如果不加handle,就会抛异常。