在android手机上显示图片信息,并让其动态移动,碰到墙壁会自动反弹
android pulltorefresh实现原理
android pulltorefresh实现原理PullToRefresh是一种常见的手势交互体验,通过在界面上向下滑动来刷新内容。
本文将介绍Android中PullToRefresh的实现原理。
Android中实现PullToRefresh的方法有很多,其中一种常见的实现方式是使用SwipeRefreshLayout类。
SwipeRefreshLayout是Android SDK提供的一个容器类,可以包含一个滚动视图(例如RecyclerView、ListView等),并实现下拉刷新效果。
当用户下拉SwipeRefreshLayout容器时,它会检测用户手势,并根据下拉的距离来触发下拉刷新事件。
下拉刷新事件可以通过设置OnRefreshListener来监听,当触发下拉刷新事件时,可以在回调函数中执行相应的刷新逻辑。
具体实现方式如下:1. 在布局文件中添加SwipeRefreshLayout作为容器,例如:```xml<androidx.swiperefreshlayout.widget.SwipeRefreshLayoutandroid:id="@+id/swipeRefreshLayout"android:layout_width="match_parent"android:layout_height="match_parent"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView"android:layout_width="match_parent"android:layout_height="match_parent" /></androidx.swiperefreshlayout.widget.SwipeRefreshLayout>```2. 在代码中获取SwipeRefreshLayout的实例,并设置OnRefreshListener监听器,例如:```javaSwipeRefreshLayout swipeRefreshLayout =findViewById(R.id.swipeRefreshLayout);swipeRefreshLayout.setOnRefreshListener(newSwipeRefreshLayout.OnRefreshListener() {@Overridepublic void onRefresh() {// 执行刷新逻辑}});```3. 在回调函数onRefresh()中执行刷新逻辑,例如更新数据或重新加载内容。
安卓触控屏操作方法
安卓触控屏操作方法
安卓手机的触屏操作方法通常有以下几种:
1. 点击:触摸屏幕上的一个点,并快速抬起手指。
这是最基本的操作,用于打开应用、选择菜单、点击按钮等。
2. 滑动:触摸屏幕并保持手指在屏幕上滑动。
可以用来滚动网页、查看照片、浏览聊天记录等。
3. 捏合:用两个手指触摸屏幕,并同时向内或向外移动。
这个手势常用于放大或缩小图片、地图等。
4. 拖拽:触摸屏幕并保持手指不离,移动手指拖动物体或程序的界面。
5. 长按:触摸屏幕并保持手指长时间接触。
一般用于打开上下文菜单,或触发其他特殊操作。
6. 多点触控:用多个手指同时触摸屏幕。
这个手势常用于在地图上同时放大缩小、旋转图片等需要多点操作的场景。
每个应用以及手机的操作系统版本可能会略有差异,但基本上都支持以上常见的触屏操作方法。
Android动画机制与使用技巧
Android动画机制与使⽤技巧动画效果⼀直是⼈机交互中⾮常重要的部分,与死板、突兀的显⽰效果不同,动画效果的加⼊,让交互变得更加友好,特别是在提⽰、引导类的场景中,合理地使⽤动画能让⽤户获得更加愉悦的使⽤体验⼀、Android View动画框架Animation框架定义了透明度、旋转、缩放、位移等⼏种常见的动画实现原理:每次绘制View时,ViewGroup中的drawChild函数获取该view的Animation的Transformation值,然后调⽤canvas.concat(transformToApply.getMatrix())通过矩阵运算完成帧动画,如果动画没有完成,就继续调⽤invalidate() 函数,启动下次绘制来驱动动画,从⽽完成整个动画的绘制。
⼆、帧动画帧动画就是⼀张张图⽚不同的切换,形成的动画效果。
⼀般⼿机的开机动画,应⽤的等待动画等都是帧动画,因为只需要⼏张图⽚轮播,极其节省资源,如果真的设计成动画,那么是很耗费资源的事。
在res⽬录下新建⼀个drawable⽂件夹并定义xml⽂件,⼦节点为 animation-list,在这⾥定义要显⽰的图⽚和每张图⽚的显⽰时长。
<animation-list xmlns:android="/apk/res/android"android:oneshot="false"><!-- false表⽰循环播放,true表⽰只播放⼀次 --><item android:drawable="@drawable/g1" android:duration="200" /><item android:drawable="@drawable/g2" android:duration="200" /><item android:drawable="@drawable/g3" android:duration="200" /><item android:drawable="@drawable/g4" android:duration="200" /><item android:drawable="@drawable/g5" android:duration="200" /><item android:drawable="@drawable/g6" android:duration="300" /><item android:drawable="@drawable/g7" android:duration="400" /><!-- 慢动作 --><item android:drawable="@drawable/g8" android:duration="500" /><item android:drawable="@drawable/g9" android:duration="200" /><item android:drawable="@drawable/g10" android:duration="200" /><item android:drawable="@drawable/g11" android:duration="200" /></animation-list>在屏幕上播放帧动画,需要布局⽂件有⼀个ImageView来显⽰动画图⽚public class MainActivity extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);ImageView iv = (ImageView) findViewById(R.id.iv);//把动画⽂件设置为imageView的背景iv.setBackgroundResource(R.drawable.frameanimation);AnimationDrawable ad = (AnimationDrawable) iv.getBackground();//播放动画ad.start();}}三、补间动画(视图动画)组件由原始状态向终极状态转变时,为了让过渡更⾃然,⽽⾃动⽣成的动画叫做补间动画。
android popupwindow基本使用方法 -回复
android popupwindow基本使用方法-回复如何在Android中使用PopupWindow一. 介绍PopupWindow是Android中一个非常强大且常用的组件,它可以在屏幕上弹出一个浮动窗口,通常用于显示额外的内容或用户交互。
PopupWindow非常灵活,可以根据需求定制不同的形状、大小和位置,为用户提供更好的体验。
二. 创建PopupWindow1. 在布局文件中定义PopupWindow的内容视图:首先,在res/layout文件夹中创建一个布局文件,作为PopupWindow的内容视图。
例如,我们可以创建一个名为"popupwindow_layout.xml"的布局文件,定义PopupWindow内部的UI元素。
2. 在代码中实例化PopupWindow:使用LayoutInflater从布局文件中加载视图,然后将其传递给PopupWindow的构造函数。
例如:javaLayoutInflater inflater = (LayoutInflater) getSystemService(YOUT_INFLATER_SERVICE);View contentView =inflater.inflate(yout.popupwindow_layout, null);PopupWindow popupWindow = newPopupWindow(contentView,youtParams.WRAP_CONTENT,youtParams.WRAP_CONTENT);这里,我们使用了LayoutInflater加载了布局文件中的视图,并将其传递给PopupWindow的构造函数。
第二个和第三个参数是PopupWindow的宽度和高度,可以根据需要设置。
三. 设置PopupWindow的属性1. 设置背景:PopupWindow的背景默认是透明的,如果要为PopupWindow设置背景,可以使用setBackgroundDrawable(Drawable drawable)方法。
android实战之实现图片滚动控件,自动播放
Android图片滚动,加入自动播放功能,使用自定义属性实现,霸气十足!大家好,记得上次我带着大家一起实现了一个类似与淘宝客户端中带有的图片滚动播放器的效果,但是在做完了之后,发现忘了加入图片自动播放的功能(或许是我有意忘记加的.....),结果图片只能通过手指滑动来播放。
于是今天我将再次带领大家,添加上之前遗漏的功能,让我们的图片播放器更加完善。
这次的程序开发将完全基于上一次的代码,如果有朋友还未看过上篇文章,请先阅读Android实现图片滚动控件,含页签功能,让你的应用像淘宝一样炫起来。
既然是要加入自动播放的功能,那么就有一个非常重要的问题需要考虑。
如果当前已经滚动到了最后一张图片,应该怎么办?由于我们目前的实现方案是,所有的图片都按照布局文件里面定义的顺序横向排列,然后通过偏移第一个图片的leftMargin,来决定显示哪一张图片。
因此当图片滚动在最后一张时,我们可以让程序迅速地回滚到第一张图片,然后从头开始滚动。
这种效果和淘宝客户端是有一定差异的(淘宝并没有回滚机制,而是很自然地由最后一张图片滚动到第一张图片),我也研究过淘宝图片滚动器的实现方法,并不难实现。
但是由于我们是基于上次的代码进行开发的,方案上无法实现和淘宝客户端一样的效果,因此这里也就不追求和它完全一致了,各有风格也挺好的。
好了,现在开始实现功能,首先是打开SlidingSwitcherView,在里面加入一个新的AsyncTask,专门用于回滚到第一张图片:[java]view plaincopy1.class ScrollToFirstItemTask extends AsyncTask<Integer, Integer, Integer> {2.3.@Override4.protected Integer doInBackground(Integer... speed) {5.int leftMargin = firstItemParams.leftMargin;6.while (true) {7. leftMargin = leftMargin + speed[0];8.// 当leftMargin大于0时,说明已经滚动到了第一个元素,跳出循环9.if (leftMargin > 0) {10. leftMargin = 0;11.break;12. }13. publishProgress(leftMargin);14. sleep(20);15. }16.return leftMargin;17. }18.19.@Override20.protected void onProgressUpdate(Integer... leftMargin) {21. firstItemParams.leftMargin = leftMargin[0];22. firstItem.setLayoutParams(firstItemParams);23. }24.25.@Override26.protected void onPostExecute(Integer leftMargin) {27. firstItemParams.leftMargin = leftMargin;28. firstItem.setLayoutParams(firstItemParams);29. }30.31.}然后在SlidingSwitcherView里面加入一个新的方法:[java]view plaincopy1./**2. * 滚动到第一个元素。
电子科技大学智慧树知到“计算机科学与技术”《移动互联网技术》网课测试题答案2
电子科技大学智慧树知到“计算机科学与技术”《移动互联网技术》网课测试题答案(图片大小可自由调整)第1卷一.综合考核(共15题)1.下列用以显示一系列图像的是?()A.ImageViewB.GalleryC.ImageSwitcherD.GridView2.在android中,ArrayAdapter类是用于?()A.用于把数据绑定到组件上B.它能把数据显示到Activity上C.它能把数据传递给广播D.它能把数据传递给服务3.在android中使用RadioButton时,要想实现互斥的选择需要用的组件是?()A.ButtonGroupB.RadioButtonsC.CheckBoxD.RadioGroup4.在表格布局中,android:collapseColumns=“1,2”的含义是?()A、在屏幕中,当表格的列能显示完时,显示1,2列B、在屏幕中,当表格的列显示不完时,折叠C、在屏幕中,不管是否能都显示完,折叠1,2列D、在屏幕中,动态决定是否显示表格5.android数据存储与访问的方式有?()A.sharedpreferenceB.数据库C.文件D.内容提供者6.下列哪个是AbsoluteLayout(绝对布局)中特有的属性?()A、android:layout_heightB、android:layout_xC、android:layout_aboveD、android:layout_toRightOf7.下列哪一个选项不属于AdapterView类的子选项?()A.ListViewB.SpinnerC.GridViewD.ScrollView8.android:completionThreshold=1是哪个组件的属性?()A.ImageButtonB.EditTextC.TextViewD.AutoCompleteTextView9.android下的单元测试要配置,以下说法不正确的是?()A.需要在manifest.xml清单文件application节点下配置instrumentationB.需要在manifest.xml清单文件manifest节点下配置instrumentationC.需要在manifest.xml清单文件application节点下配置uses-libraryD.需要让测试类继承AndroidTestCase类10.下列说法正确的有?()A.javac.exe能指定编译结果要置于哪个目录(directory)B.在编译程序时,所能指定的环境变量不包括class pathC.javac一次可同时编译数个java源文件D.环境变量可在编译source code时指定11.关于res/raw目录说法正确的是?()A、这里的文件是原封不动的存储到设备上会转换为二进制的格式B、这里的文件最终以二进制的格式存储到指定的包中C、这里的文件是原封不动的存储到设备上不会转换为二进制的格式D、这里的文件最终不会以二进制的格式存储到指定的包中12.android下的单元测试要配置,以下说法不正确的是?()A、需要在manifest.xml清单文件application节点下配置instrumentationB、需要在manifest.xml清单文件manifest节点下配置instrumentationC、需要在manifest.xml清单文件application节点下配置uses-libraryD、需要让测试类继承AndroidTestCase类13.进度条中哪个属性是设置进度条大小格式的?()A.android:secondaryProgressB.android:progressC.android:maxD.style14.在使用SQLiteOpenHelper这个类时,它的哪一个方法是用来实现版本升级之用的?()A、onCreate()B、onCreade()C、onUpdate()D、onUpgrade()15.在使用SQLiteOpenHelper这个类时,它的哪一个方法是用来实现版本升级之用的?()A.onCreate()B.onCreade()C.onUpdate()D.onUpgrade()第2卷一.综合考核(共15题)1.android关于service生命周期的onCreate()和onStart()说法正确的是?()A、如果service已经启动,将先后调用onCreate()和onStart()方法B、当第一次启动的时候先后调用onCreate()和onStart()方法C、当第一次启动的时候只会调用onCreate()方法D、如果service已经启动,只会执行onStart()方法,不再执行onCreate()方法2.在多个应用中读取共享存储数据时,需要用到哪个对象的query方法?()A.ContentResolverB.ContentProviderC.CursorD.SQLiteHelper3.当Activity被消毁时,如何保存它原来的状态?()A.实现Activity的onSaveInstanceState()方法B.实现Activity的onSaveInstance()方法C.实现Activity的onInstanceState()方法D.实现Activity的onSaveState()方法4.关于适配器的说法正确的是?()A、它主要是用来存储数据B、它主要用来把数据绑定到组件上C、它主要用来解析数据D、它主要用来存储xml数据5.下列关于XML布局文件在Java代码中被引用的说明中,不正确的是?()A.在Activity中,可以使用findViewById()方法,通过资源id,获得指定视图元素B.在Activity中,可以使用R.drawable-system.***方式引用Android系统所提供的图片资源C.在Activity中,可以使用setContentView()方法,确定加载哪一个布局文件D.可以使用View类的findViewById()方法,获得当前View对象中的某一个视图元素6.android:completionThreshold=1是哪个组件的属性?()A、ImageButtonB、EditTextC、TextViewD、AutoCompleteTextView7.创建子菜单的方法是?()A.addB.addSubMenuC.createSubMenuD.createMenu8.下列哪一个选项不属于Android中预定义的布局方式?()A、TabLayoutB、RelativeLayoutC、AbsoluteLayoutD、LinearLayout9.关于res/raw目录说法正确的是?()A.这里的文件是原封不动的存储到设备上会转换为二进制的格式B.这里的文件最终以二进制的格式存储到指定的包中C.这里的文件是原封不动的存储到设备上不会转换为二进制的格式D.这里的文件最终不会以二进制的格式存储到指定的包中10.android是如何组织Activity的?()A、以栈的方式组式ActivityB、以队列的方式组织ActivityC、以树形方式组织ActivityD、以链式方式组织Activity11.在Activity的生命周期中,当它从可见状态转向半透明状态时,它的哪个方法必须被调用?()A、onStop()B、onPause()C、onRestart()D、onStart()12.android关于service生命周期的onCreate()和onStart()说法正确的是?()A.如果service已经启动,将先后调用onCreate()和onStart()方法B.当第一次启动的时候先后调用onCreate()和onStart()方法C.当第一次启动的时候只会调用onCreate()方法D.如果service已经启动,只会执行onStart()方法,不再执行onCreate()方法13.下列说法错误的是?()A、Button是普通按钮组件,除此外还有其他的按钮组件B、TextView是显示文本的组件,TextView是EditText的父类C、EditText是编辑文本的组件,可以使用EditText输入特定的字符D、ImageView是显示图片的组件,可以通过设置显示局部图片14.在手机开发中常用的数据库是?()A.SQLiteB.OracleC.SqlServerD.MySQL15.在Activity中,如何获取service对象?()A.可以通过直接实例化得到B.可以通过绑定得到C.通过startService()D.通过getService()获取第1卷参考答案一.综合考核1.参考答案:B2.参考答案:A3.参考答案:D4.参考答案:D5.参考答案:ABCD6.参考答案:B7.参考答案:D 8.参考答案:D9.参考答案:A10.参考答案:ABC11.参考答案:C12.参考答案:A13.参考答案:D14.参考答案:D15.参考答案:D第2卷参考答案一.综合考核1.参考答案:BD2.参考答案:A3.参考答案:A4.参考答案:B5.参考答案:B6.参考答案:D7.参考答案:B8.参考答案:A9.参考答案:C10.参考答案:A11.参考答案:B12.参考答案:BD13.参考答案:D14.参考答案:A15.参考答案:D。
android手把手开发一个图片浏览器
android手把手开发一个图片浏览器这次我给大家讲解一个Android图片浏览器的应用。
AndroidAndroid是基于Linux内核的软件平台和操作系统,早期由Google开发,后由开放手机联盟Open Handset Alliance)开发。
它采用了软件堆层(software stack,又名以软件叠层)的架构,主要分为三部分。
低层以Linux内核工作为基础,只提供基本功能;其他的应用软件则由各公司自行开发,以Java作为编写程序的一部分。
另外,为了推广此技术,Google和其它几十个手机公司建立了开放手机联盟。
Android在未公开之前常被传闻为Google电话或gPhone。
大多传闻认为Google开发的是自己的手机电话产品,而不是一套软件平台。
到了2010年1月,Google开始发表自家品牌手机电话的Nexus One。
目前最新版本为Android2.1。
下图是它的结构:简单来讲,Android就是一个开源的手机软件开发工具。
我主要给大家讲应用方面,大家如果有兴趣,可以了解相关基本知识。
要开发一个Android应用,首先得搭建Android开发环境:下载并安装Android sdk(Software Development Kit, 即软件开发工具包)。
由于Android 开发是集成在Eclipse中,需下载并安装ADT (Eclipse集成Android sdk插件)。
搭建环境会用一个专门的章节为大家详细讲解,这里我就不再赘述。
Android开发环境搭好后,我们先启动Eclipse创建一个Android的应用程序,然后在左上角单击File,New,Android Project,如下图所示:如果在图中Java Project找不到Android Project:在左上角单击File,New,Other:在弹出框中Android文件件中选中Android Project,然后单击Next进入下一步:弹出一个列表框:下面对这个列表的一些重要属性进行讲解:1.应用程序名称以及内容栏:2.工具栏:采用的编译工具即Android模拟器:3.属性栏:即应用程序中的相关属性:Android 这就是我们刚才创建的一个Android应用程序如下图:在这里面,我们最关心的是界面(main.xml)与后台(Test1.java):单击main.xml:我们先看看中间视图:这是一个页面编辑器模式:在左下角点击main.xml切换到界面编码模式:这就是刚才页面视图的源码:下面让我们看看后台(Test1.java)源码:单击Test1.java:以下将此类程序称之为activity(活动),该activity运行时会自动调用onCreate方法:而上图中onCreate方法是启动res文件夹下的layout下的main.xml界面。
Android从入门到精通100题(含答案和解析)
Android 100题----根据《Android从入门到精通》(一)判断题1.在Eclipse中开发Android应用,需要安装插件AVD来辅助开发。
(×)【ADT(Android Develop Tools);AVD(Android Virtual Device)安卓虚拟设备即模拟器】P202.在Android项目开发时,当res包中的资源发生变化时,需要同时手动修改对应的R文件中的静态内部类中的常量。
(×)P273.Assets包用于保存原始资源文件,其中的文件会编译到.apk中,并且原文件名会被保留。
可以(√)使用URI来定位该文件夹中的文件,然后使用AssetManager类以流的方式来读取文件内容。
4.Drawable子包只用来保存图片资源。
(×)【还会保存XML文件】P2425.Mksdcard命令可以快速创建NTFS磁盘镜像,启动模拟器时加载该磁盘镜像,可以模拟真实设备的SD卡。
(×)【FAT32】P486.使用Mksdcard命令创建的模拟器的SD卡,其最小为9MB,最大为1024GB。
(×)【1023GB】P497.在TableLayout中,可以设置相应的属性使列被隐藏(android:collapseColumns)、收缩(android:shrinkColumns)或拉伸(android:stretchColumns),列序号从0开始,多个列序号之间用“|”分隔。
(×)【列号以“,”分隔】P708.DatePicker对象获取到的月份需要加1,才能表示真正的月份。
(√)P1079.进度条组件(ProcessBar)中的方法incrementProgressBy(int diff)用于设置进度条的增加或减少。
当参数值大于1时,表示进度增加;小于1时,表示进度减少。
(×)【以正负数表示进度的增加或减少】P12410.图像切换器(ImageSwicther),由于不需要显示说明性文字,所以可以使用BaseAdapter基本适配器为其指定图片来源。
android自定义ImageView实现缩放,回弹效果
android自定义ImageView实现缩放,回弹效果androidImageview缩放回弹话不多说上代码:MainActivity.javapublic class MainActivity extends Activity{private LinearLayout ll_viewArea;private youtParams parm;private ViewArea viewArea;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//去除titlerequestWindowFeature(Window.FEATURE_NO_TITLE);//去掉Activity上面的状态栏getWindow().setFlags(youtParams.FLAG_FULLSCREEN,youtParams. FLAG_FULLSCREEN);setContentView(yout.main);ll_viewArea = (LinearLayout) findViewById(R.id.ll_viewArea); parm = newyoutParams(youtParams.FILL_PARENT, youtParams.FILL_PARENT);viewArea = newViewArea(MainActivity.this,R.drawable.psu); //自定义布局控件,用来初始化并存放自定义imageViewll_viewArea.addView(viewArea,parm);}}这段代码中要注意的问题是去掉title和状态栏两句代码必须放到setContentView(yout.main);话的前面。
而且这两句话必须有,因为后面计算回弹距离是根据全屏计算的(我的i9000就是480x800),如果不去掉title 和状态栏,后面的回弹会有误差,总是回弹不到想要的位置。
【冷热冲击箱】信息桌面全搞定 安卓动态壁纸设置技巧
信息桌面全搞定安卓动态壁纸设置技巧安卓系统的开放性给我们美化手机提供了不少渠道,可以轻松的安装各式APP来直接在桌面上显示天气、日期等等信息,但是一般都要装上2、3个APP才能实现全部效果,这样不但会增加系统的负担,而且不同APP的美术风格不同,会让桌面变得很丑。
今天给大家介绍一款APP,可以直接在桌面上显示时间、日期、温度、电量及信号强度等等信息,而且设计感十足。
这款应用名叫《wp clock design live wallpaper》,安装好以后打开它,点击中间的“live wallpaper”就可以启动了。
它借由安卓系统的动态桌面来实现功能,点击后会自动跳转到动态桌面界面,然后选择“wp clock 2”就可以部署上它。
如果想对其进行详细设置,可以进入动态壁纸的设置界面,继续选择“wp clock 2”进入设置界面,不过大部分设置比如语言等,还是需要付费版才能设置。
先进入“appearance”选项内的“general setting”看看,在其中我们可以设置文字间距及是否在锁屏显示,由于《wp clock》的信息量比较大,会让屏幕显得很乱,小编推荐大家还是不要在锁屏显示了。
在“general setting”下方的“global appearance setting”中可以调整整体的字体颜色、大小等等。
从“telephony provider”开始到“weather”都是对桌面显示信息的细节进行调调整,可以对温度、电量、WIFI等信息的显示方式、颜色、字体等等进行单独设置。
回到主菜单后,我们还可以进入“background”中对桌面背景进行设置,除了桌面颜色等以外,可以直接用相册中的图片做背景。
/tech/ true 中关村在线report 1252 安卓系统的开放性给我们美化手机提供了不少渠道,可以轻松的安装各式APP来直接在桌面上显示天气、日期等等信息,但是一般都要装上2、3个APP 才能实现全部效果,这样不但会增加系统的负担,而且不同APP 的美术风格不同,会让桌面变得很丑。
android photoview原理
android photoview原理一、概述Android的PhotoView是Android中一个非常实用的库,它提供了对图像的缩放和滚动功能。
在Android应用开发中,我们经常需要展示大量的图片,并且允许用户进行缩放和滚动查看。
然而,Android原生ImageView控件并不支持这些功能。
为了实现这些功能,开发者需要自己编写大量的代码。
因此,Android PhotoView库的出现大大简化了开发者的开发工作。
二、Photoview的核心特性1. 缩放功能:用户可以自由地缩放图片,以便更仔细地查看图片的细节。
2. 滚动功能:如果图片超出了屏幕大小,用户可以滚动屏幕来查看图片的其他部分。
3. 触摸事件处理:PhotoView使用触摸事件来处理用户的操作,如放大、缩小和滚动等。
4. 自定义属性:开发者可以通过自定义属性来自定义PhotoView的外观和行为。
5. 支持不同显示模式:包括适应屏幕大小、固定比例和填充屏幕等模式。
三、工作原理详解1. 触摸事件处理PhotoView通过触摸事件来处理用户的操作。
当用户触摸屏幕时,它会根据触摸的位置和动作来判断用户的意图。
例如,如果用户在屏幕上拖动,PhotoView会计算拖动的距离和方向,并相应地滚动图片。
如果用户用两根手指在屏幕上分开或靠近,PhotoView会判断为缩放操作,并调整图片的大小。
2. 图像变换为了实现缩放和滚动功能,PhotoView需要对图像进行变换。
它使用矩阵和变换算法来对图像进行缩放和移动。
当用户缩放图像时,PhotoView会创建一个新的矩阵,并使用这个矩阵来计算新的图像位置和大小。
当用户滚动图像时,PhotoView会计算滚动的距离和方向,并相应地移动图像。
3. 渲染图像在显示图像时,PhotoView使用Android的画布(Canvas)和画笔(Paint)类来绘制图像。
它首先将图像加载到内存中,然后创建一个画布和画笔对象。
android之页面动态切换
android之页面动态切换如何实现手机上手动滑动翻页效果学习之笔记。
一般实现这个特效会用到一个控件:ViewFlipper<1>View切换的控件—ViewFlipper除了这个ViewFlipper,我们还需要了解一下ViewAnimator。
它主要是为其中的View切换提供动画效果。
还会用到几个方法:setInAnimation:设置View进入屏幕时候使用的动画。
该方法有两个重载方法,即可以直接传入Animation对象,也可以传入定义的Animation文件的resourceID。
setOutAnimation:设置View退出屏幕时候使用的动画。
使用方法和setInAnimation方法一样。
showPrevious: 调用该方法可以显示FrameLayout里面的上一个V iewshowNext:调用该方法可以显示FrameLayout里面的下一个V iew。
<2>实现滑动实现滑动就必须介绍一下GestureDetector:GestureDetector类中可以用来检测各种手势事件。
该类有两个回调接口,分别用来通知具体的事件。
GestureDetector.OnDoubleT apListener:用来通知DoubleTap事件,类似于鼠标的双击事件,该接口有如下三个回调函数:1. onDoubleTap(MotionEvent e):通知DoubleTap手势,2. onDoubleTapEvent(MotionEvent e):通知DoubleTap手势中的事件,包含down、up和move事件(这里指的是在双击之间发生的事件,例如在同一个地方双击会产生DoubleTap 手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知);3. onSingleTapConfirmed(MotionEvent e):用来判定该次点击是SingleTap而不是DoubleTap,如果连续点击两次就是DoubleTap手势,如果只点击一次,系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。
android bottomsheetdialog原理
android bottomsheetdialog原理Android BottomSheetDialog原理:BottomSheetDialog是一种特殊类型的对话框,它从屏幕底部弹出,并沿着屏幕底部扩展。
它常用于显示一组操作或额外的内容,例如分享操作、筛选选项或展示图片集合。
BottomSheetDialog的实现原理主要涉及以下几个方面:1. 底部扩展动画:BottomSheetDialog通过使用底层的CoordinatorLayout布局和Behavior来实现底部扩展动画。
CoordinatorLayout是一个灵活的布局容器,它能够协调和处理子视图之间的互动关系。
而Behavior则是一种可定义对子视图的响应方式的对象。
BottomSheetDialog使用了BottomSheetBehavior,它用于处理BottomSheet的展开和折叠动画。
2. 触摸事件处理:BottomSheetDialog具有响应触摸事件的能力。
当用户触摸并滑动BottomSheetDialog时,它会根据滑动的方向和速度做出相应的动画响应。
例如,用户向上滑动将导致BottomSheetDialog向上展开,向下滑动则会折叠BottomSheetDialog。
3. 内容填充:BottomSheetDialog可以容纳各种类型的内容,包括布局、视图或自定义视图组合。
通过设置合适的内容,可以实现不同的功能和展示效果。
4. 生命周期管理:BottomSheetDialog遵循Activity/Fragment的生命周期,并具有相应的生命周期方法。
例如,当屏幕旋转或对话框临时关闭时,BottomSheetDialog可以保存和恢复其状态,以确保用户体验的连续性。
总结起来,Android BottomSheetDialog是基于CoordinatorLayout和Behavior的一种特殊的对话框,利用底部扩展动画、触摸事件处理、内容填充和生命周期管理等特性,实现了从屏幕底部弹出的效果,并提供了丰富的自定义选项,使得开发者可以根据需求创建不同样式的底部弹出对话框。
零基础Android移动应用开发_中国大学mooc课后章节答案期末考试题库2023年
App Inventor-零基础Android移动应用开发_浙大城市学院中国大学mooc课后章节答案期末考试题库2023年1.要实现图像精灵朝着某个方向连续移动,以下哪个属性和这个功能无关?答案:旋转2.以下哪个组件没有“启用”属性?答案:画布3.图像精灵“安安”在屏幕上移动,要让图像精灵“老虎”自动去追图像精灵“安安”,以下哪个代码与此功能无关?答案:设置图像精灵“老虎”的旋转为“真”4.根据下方代码,哪个选项不正确?答案:上图中被划动事件中的参数x坐标和y坐标,指的是手指离开屏幕时的x 和y坐标5.关于App Inventor提供的自定义过程,下列说法不正确的是?答案:自定义过程中不允许调用另一个自定义过程6.要设置App在后台也能接收短信,需要设置“短信收发器组件”的“启用消息接收”属性为()答案:总是接收7.用户在“文本输入框用户名”中输入“zuccer”,先点击“按钮保存”,再点击“按钮获取”,请问此时全局变量“密码”的值是?答案:28.以下哪个不属于跟组件关联的编程模块?答案:数学计算模块9.以下哪个属性不能在Screen1的组件属性面板中修改?答案:屏幕高度10.为了产生手机振动效果,需要用到()组件答案:音效11.要弹出只有一个按钮的对话框,可以调用对话框组件的()过程答案:显示消息对话框12.要设置一个应用的安装图片为icon.png,需要设置以下哪个属性?答案:图标13.要将多个组件放在同一行显示,以下哪个布局方式无法实现要求?答案:垂直布局14.假设“价格”变量为45,在“文本输入框价格”组件中输入30,点击确定按钮,执行下图的代码后,“标签提醒”组件中显示的文本内容为()答案:没猜中15.确定按钮被点击时,“标签提醒”组件中的文本显示为?答案:516.要设置球形精灵在水平方向位于画布的正中心,需要设置它的x坐标为()答案:画布的宽度/2-球形精灵的半径17.以下关于App Inventor中计时器的说法,哪个是不正确的?答案:计时器在计时事件里,无法设置自己的启用为假18.要实现手指在屏幕上拖动作画功能,需要在画布的“被拖动”事件里,调用画布的“画线”方法,以下哪个选项的设置是正确的?答案:设置x1、y1为前点x和y坐标,设置x2、y2为当前点x和y坐标19.以下关于在App Inventor中新建一个屏幕,说法正确的是()答案:屏幕一旦命名确定后就无法修改名称了20.以下关于在App Inventor中的屏幕相互调用,说法不正确的是()答案:一个屏幕可以直接访问另一个屏幕中的变量。
android自定义ImageView实现缩放,回弹效果
android自定义ImageView实现缩放,回弹效果androidImageview缩放回弹话不多说上代码:MainActivity.javapublic class MainActivity extends Activity{private LinearLayout ll_viewArea;private youtParams parm;private ViewArea viewArea;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//去除titlerequestWindowFeature(Window.FEATURE_NO_TITLE);//去掉Activity上面的状态栏getWindow().setFlags(youtParams.FLAG_FULLSCREEN,youtParams. FLAG_FULLSCREEN);setContentView(yout.main);ll_viewArea = (LinearLayout) findViewById(R.id.ll_viewArea); parm = newyoutParams(youtParams.FILL_PARENT, youtParams.FILL_PARENT);viewArea = newViewArea(MainActivity.this,R.drawable.psu); //自定义布局控件,用来初始化并存放自定义imageViewll_viewArea.addView(viewArea,parm);}}这段代码中要注意的问题是去掉title和状态栏两句代码必须放到setContentView(yout.main);话的前面。
而且这两句话必须有,因为后面计算回弹距离是根据全屏计算的(我的i9000就是480x800),如果不去掉title 和状态栏,后面的回弹会有误差,总是回弹不到想要的位置。
Android多点触控技术实战,自由地对图片进行缩放和移动
Android多点触控技术实战,自由地对图片进行缩放和移动在Android瀑布流照片墙的效果这篇文章中,虽然这种效果很炫很酷,但其实还只能算是一个半成品,因为照片墙中所有的图片都是只能看不能点的。
因此本篇文章中,我们就来对这一功能进行完善,加入点击图片就能浏览大图的功能,并且在浏览大图的时候还可以通过多点触控的方式对图片进行缩放。
我们现在就开始动手吧,首先打开上次的PhotoWallFallsDemo项目,在里面加入一个ZoomImageView类,这个类就是用于进行大图展示和多点触控缩放的,代码如下所示:[java] view plain copypublic class ZoomImageView extends View {/*** 初始化状态常量*/public static final int STATUS_INIT = 1;/*** 图片放大状态常量*/public static final int STATUS_ZOOM_OUT = 2;/*** 图片缩小状态常量*/public static final int STATUS_ZOOM_IN = 3;/*** 图片拖动状态常量*/public static final int STATUS_MOVE = 4;/*** 用于对图片进行移动和缩放变换的矩阵*/private Matrix matrix = new Matrix();/*** 待展示的Bitmap对象*/private Bitmap sourceBitmap;/*** 记录当前操作的状态,可选值为STATUS_INIT、STATUS_ZOOM_OUT、STA TUS_ZOOM_IN和STATUS_MOVE*/private int currentStatus;/*** ZoomImageView控件的宽度*/private int width;/*** ZoomImageView控件的高度*/private int height;/*** 记录两指同时放在屏幕上时,中心点的横坐标值*/private float centerPointX;/*** 记录两指同时放在屏幕上时,中心点的纵坐标值*/private float centerPointY;/*** 记录当前图片的宽度,图片被缩放时,这个值会一起变动*/private float currentBitmapWidth;/*** 记录当前图片的高度,图片被缩放时,这个值会一起变动*/private float currentBitmapHeight;/*** 记录上次手指移动时的横坐标*/private float lastXMove = -1;/*** 记录上次手指移动时的纵坐标*/private float lastYMove = -1;/*** 记录手指在横坐标方向上的移动距离*/private float movedDistanceX;/*** 记录手指在纵坐标方向上的移动距离*/private float movedDistanceY;/*** 记录图片在矩阵上的横向偏移值*/private float totalTranslateX;/*** 记录图片在矩阵上的纵向偏移值*/private float totalTranslateY;/*** 记录图片在矩阵上的总缩放比例*/private float totalRatio;/*** 记录手指移动的距离所造成的缩放比例*/private float scaledRatio;/*** 记录图片初始化时的缩放比例*/private float initRatio;/*** 记录上次两指之间的距离*/private double lastFingerDis;/*** ZoomImageView构造函数,将当前操作状态设为STATUS_INIT。
Android实现回弹ScrollView的原理
Android实现回弹ScrollView的原理本⽂实例为⼤家分享了Android实现回弹ScrollView的原理,供⼤家参考,具体内容如下回弹的ScrollView⽹上看到的通常是ElasticScrollView,有⼀个Bug:点击⼦控件滑动时,滑动⽆效,所以针对此问题,我对ElasticScrollView做了改进。
原理图代码我在注释中做了详细的说明import android.content.Context;import android.graphics.Rect;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;import android.view.animation.Animation;import android.view.animation.DecelerateInterpolator;import android.view.animation.TranslateAnimation;import android.widget.ScrollView;/*** Created by Tindle Wei.*/public class ElasticScrollView extends ScrollView {/*** ⼿指抖动误差*/private static final int SHAKE_MOVE_VALUE = 8;/*** Scrollview内部的view*/private View innerView;/*** 记录innerView最初的Y位置*/private float startY;/*** 记录原始innerView的⼤⼩位置*/private Rect outRect = new Rect();private boolean animationFinish = true;public ElasticScrollView(Context context) {super(context);}public ElasticScrollView(Context context, AttributeSet attrs) {super(context, attrs);}/*** 继承⾃View* 在xml的所有布局加载完之后执⾏*/@Overrideprotected void onFinishInflate() {if (getChildCount() > 0) {innerView = getChildAt(0);}}/*** 继承⾃ViewGroup* 返回true, 截取触摸事件* 返回false, 将事件传递给onTouchEvent()和⼦控件的dispatchTouchEvent() */@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {// 判断点击⼦控件 or 按住⼦控件滑动// 如果点击⼦控件,则返回 false, ⼦控件响应点击事件// 如果按住⼦控件滑动,则返回 true, 滑动布局switch (ev.getAction()) {case MotionEvent.ACTION_DOWN: {startY = ev.getY();break;}case MotionEvent.ACTION_MOVE: {float currentY = ev.getY();float scrollY = currentY - startY;// 是否返回 truereturn Math.abs(scrollY) > SHAKE_MOVE_VALUE;}}// 默认返回 falsereturn super.onInterceptTouchEvent(ev);}@Overridepublic boolean onTouchEvent(MotionEvent ev) {if (innerView == null) {return super.onTouchEvent(ev);} else {myTouchEvent(ev);}return super.onTouchEvent(ev);}public void myTouchEvent(MotionEvent ev) {if (animationFinish) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:startY = ev.getY();super.onTouchEvent(ev);break;case MotionEvent.ACTION_UP:startY = 0;if (isNeedAnimation()) {animation();}super.onTouchEvent(ev);break;case MotionEvent.ACTION_MOVE:final float preY =startY == 0 ? ev.getY() : startY;float nowY = ev.getY();int deltaY = (int) (preY - nowY);startY = nowY;// 当滚动到最上或者最下时就不会再滚动,这时移动布局if (isNeedMove()) {if (outRect.isEmpty()) {// 保存正常的布局位置outRect.set(innerView.getLeft(), innerView.getTop(),innerView.getRight(),innerView.getBottom());}// 移动布局// 这⾥ deltaY/2 为了操作体验更好yout(innerView.getLeft(),innerView.getTop() - deltaY / 2,innerView.getRight(),innerView.getBottom() - deltaY / 2);} else {super.onTouchEvent(ev);}break;default:break;}}}/*** 开启移动动画*/public void animation() {TranslateAnimation ta = new TranslateAnimation(0, 0, 0, outRect.top - innerView.getTop()); ta.setDuration(400);// 减速变化为了⽤户体验更好ta.setInterpolator(new DecelerateInterpolator());ta.setAnimationListener(new Animation.AnimationListener() {@Overridepublic void onAnimationStart(Animation animation) {animationFinish = false;}@Overridepublic void onAnimationRepeat(Animation animation) {}@Overridepublic void onAnimationEnd(Animation animation) {innerView.clearAnimation();// 设置innerView回到正常的布局位置yout(outRect.left,outRect.top, outRect.right, outRect.bottom);outRect.setEmpty();animationFinish = true;}});innerView.startAnimation(ta);}/*** 是否需要开启动画*/public boolean isNeedAnimation() {return !outRect.isEmpty();}/*** 是否需要移动布局*/public boolean isNeedMove() {int offset = innerView.getMeasuredHeight() - getHeight();offset = (offset < 0) ? 0: offset;int scrollY = getScrollY();return (offset == 0 || scrollY == offset);}}其他说明1、下⾯是继承关系:ElasticScrollView extends ScrollViewScrollView extends FrameLayoutFrameLayout extends ViewGroupViewGroup extends View2、解决⼦控件截取滑动监听的代码在onInterceptTouchEvent() ,通过监听Y的变化,来判断是点击⼦控件还是上拉下拉3、getMeasuredHeight()返回的是原始测量⾼度,与屏幕⽆关,getHeight()返回的是在屏幕上显⽰的⾼度。
android设置水平、垂直滚动条自动滚动
设置水平、垂直滚动条自动滚动在做一个小项目时遇到需要随着手势翻页的同时,上面导航栏也需要随着而滑动,这样就需要在手势事件中调用滚动条的水平滑动事件。
总体效果图如下:滚动部分布局XML片段:[html] view plaincopy<HorizontalScrollViewandroid:id="@+id/horizonMenu"android:layout_width="match_parent"android:layout_height="match_parent"android:scrollbars="none" ><LinearLayoutandroid:id="@+id/chart_navigate"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_alignParentLeft="true"android:layout_gravity="top"android:background="#ffffff"android:orientation="horizontal"android:layout_margin="0dp"android:layout_marginBottom="1dip"android:pad ding="0dp"></LinearLayout></HorizontalScrollView>部分代码:[java] view plaincopy/*** the layout of chart.** @author liangliu**/public class ChartFramgment extends Fragment {private static View viewMain;// the loading dialog after completed to l oginprivate static LinearLayout linearLayout;private static int navigateWidth = 0;private static HorizontalScrollView horizontalScrollView;private final static Handl er handler = new Handler();@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundl e savedInstanceState) {super.onCreateView(inflater, container, savedInstanceState);// get the view by id in the framgment.viewMain = inflater.inflate(yout.chart, container, false);DisplayMetrics displaymetrics = new DisplayMetrics();getActivity().getWind owManager().getDefaultDisplay().getMetrics(displaymetrics);navigateWidth=(int)(displaymetrics.widthPixels*0.8);horizontalScrollView = (HorizontalScrollView) viewMain.findViewById(R.id.horizonMenu);horizontalScrollView.setLayoutParams(new youtParams(navigateWidth, 100));linearLayout = (LinearLayout) viewMain.findViewById(R.id.chart_navigate);linearLayout.setOrientation(LinearLayout.HORIZONTAL);return viewMain;}/*** 手势事件,滑动到下一页*/public static void slipToNext() {//滑动到下一页d的相关处理//......//导航滚动条随着水平滚动,这里必须放到handler里面异步处理滚动才会到位,否则滚动会是上次滚动的结果,总差那么一点。
移动应用设计智慧树知到答案章节测试2023年东莞城市学院
第一章测试1.第二代移动通信技术能够处理图像、音乐、视频流等多种媒体形式。
()A:对B:错答案:B2.第四代移动通信技术包含TD-LTE和FDD-LTE两种制式。
()A:对B:错答案:A3.下面关于通信技术的描述,正确的是()。
A:蜂窝电话标准很容易被窃听B:1G以数字语音传输技术为核心。
C:2G时代也有智能手机,可以支持一些简单的Java小程序D:4G是集3G与WLAN于一体的通信技术答案:ACD4.下列选项中,属于Android系统架构的是()。
A:Linux内核B:核心类库C:应用程序层D:应用程序框架层答案:ABCD5.下列选项中,属于Google发布Android源代码的授权方式是()。
A:许可证B:开源C:Apaches开源许可证D:Apache开源许可证答案:D第二章测试1.ImageView使用android:src属性设置图片时,该图片会自动填充满控件。
()A:错B:对答案:A2.下列选项中,通过Toast类提示的消息显示的时间可以设置为()。
A:Toast.LENGTH_SHORTB:LENGTH_SHORTC:LENGTH_LONGD:Toast.LENGTH_LONG答案:AD3.下列选项中,用于设置TextView控件的文本内容的属性是()。
A:android:textSizeB:android:textColorC:android:textValueD:android:text答案:D4.下面关于RadioButton控件的描述,正确的是()。
A:RadioButton表示单选按钮B:RadioButton有“选中”和“未选中”的状态C:RadioButton默认为选中状态D:都不对答案:A5.下列选项中,用于设置CheckBox控件的选择监听事件的方法是()。
A:setOnClickListener()B:setOnCheckedChangeListener()C:setOnMenuItemSelectedListener()D:setOnCheckedListener()答案:B第三章测试1.当客户端在与服务器端建立连接后,向服务器端发送的请求,被称作HTTP请求。
Android
Android ScrollView实现滚动超过边界松⼿回弹ScrollView滚动超过边界,松⼿回弹Android原⽣的ScrollView滑动到边界之后,就不能再滑动了,感觉很⽣硬。
不及再多滑动⼀段距离,松⼿后回弹这种效果顺滑⼀些。
先查看下滚动⾥⾯代码的处理case MotionEvent.ACTION_MOVE:final int activePointerIndex = ev.findPointerIndex(mActivePointerId);if (activePointerIndex == -1) {Log.e(TAG, "Invalid pointerId=" + mActivePointerId + " in onTouchEvent");break;}final int y = (int) ev.getY(activePointerIndex);int deltaY = mLastMotionY - y;………………………………if (!mIsBeingDragged && Math.abs(deltaY) > mTouchSlop) {final ViewParent parent = getParent();if (parent != null) {parent.requestDisallowInterceptTouchEvent(true);}mIsBeingDragged = true;if (deltaY > 0) {deltaY -= mTouchSlop;} else {deltaY += mTouchSlop;}}if (mIsBeingDragged) {// Scroll to follow the motion eventmLastMotionY = y - mScrollOffset[1];final int oldY = mScrollY;final int range = getScrollRange();final int overscrollMode = getOverScrollMode();boolean canOverscroll = overscrollMode == OVER_SCROLL_ALWAYS ||(overscrollMode == OVER_SCROLL_IF_CONTENT_SCROLLS && range > 0);// Calling overScrollBy will call onOverScrolled, which// calls onScrollChanged if applicable.if (overScrollBy(0, deltaY, 0, mScrollY, 0, range, 0, mOverscrollDistance, true)&& !hasNestedScrollingParent()) {// Break our velocity if we hit a scroll barrier.mVelocityTracker.clear();}………………………………}break;先判断⼿指的移动距离,超过了移动的默认距离,认为是处于mIsBeingDragged状态,然后调⽤overScrollBy()函数,这个⽅法是实现滚动的关键。
- 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,就会抛异常。