Android开发轻松实现带文字的图片按钮
imagebutton控件的用法

imagebutton控件的用法============一、概述----ImageButton控件是Android开发中常用的控件之一,它结合了Button控件和ImageButton控件的特点,可以在图片上实现点击事件。
本文将详细介绍ImageButton控件的用法,包括基本属性、事件处理和自定义样式等。
二、基本属性------* `id`:控件的唯一标识符,用于在XML布局文件或代码中引用该控件。
* `background`:设置控件的背景图片或Drawable对象。
* `src`:设置按钮的选中图片,即点击后的显示图片。
* `backgroundRes`和`backgroundState`:用于自定义背景样式,支持点击事件和长按事件。
三、事件处理------ImageButton控件支持点击事件、长按事件和滑动事件等。
可以通过为ImageButton控件绑定相应的事件监听器来实现。
以下是几个常用的监听器:* `OnClickListener`:点击事件监听器,用于处理点击事件。
* `OnLongClickListener`:长按事件监听器,用于处理长按事件。
* `OnScrollListener`:滑动事件监听器,用于处理滑动事件。
四、自定义样式-------ImageButton控件支持通过XML布局文件或代码自定义样式,包括背景图片、边框样式、圆角大小等。
可以通过设置`background`属性或使用`StateListAnimator`来实现自定义样式。
五、使用示例------以下是一个使用ImageButton控件的示例代码:```java// 创建一个ImageButton控件,设置背景图片和选中图片ImageButton imageButton = new ImageButton(this);imageButton.setBackgroundResource(R.drawable.button_background);imageButton.setImageResource(R.drawable.button_selected);// 绑定点击事件监听器,处理点击事件imageButton.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 点击事件的处理逻辑}});```六、总结----ImageButton控件是Android开发中常用的控件之一,通过设置基本属性和绑定相应的事件监听器,可以实现图片上的点击事件。
《Android应用程序设计》实验报告 (2)

实验1 搭建开发环境与第1个Android程序【实验目的】1.熟悉Android开发环境的搭建2.掌握用Eclipse开发Android程序的流程【实验内容】一、搭建Android开发环境按照下面的步骤,完成Android环境的搭建。
1.1 JDK的安装及配置1.根据电脑的系统位数安装软件包里的JDK,安装目录设置为d:\jdk1.x。
(d为你的安装盘,可以设为任意盘;x为你安装的jdk版本)2. WIN7系统环境变量设置(1)环境变量设置一(2)环境变量设置二(3)环境变量设置三(4)环境变量设置四1)创建新的环境变量。
名:JA V A_HOME,值:x:\jdk1.72)修改系统变量Path,在path变量值前添加这段:%JA V A_HOME%\bin;3)修改系统变量classpath,值为:.;%JA V A_HOME%\lib\dt.jar;%JA V A_HOME%\lib\tools.jar;(5)环境变量设置五1)测试开发环境。
在开始->搜索程序和文件里输入cmd.exe,打开cmd。
输入cd c:\ 命令进入c盘根目录。
2)在c盘根目录下使用记事本编写源文件,并存为java文件。
public class MyApp {public static void main (String[] args) {System.out.println(“我能学好Java语言!”);} }3)使用javac命令编译程序,在cmd命令行输入:javac MyApp.java生成class类型文件。
4)使用java命令运行程序,在cmd命令行输入:java MyApp如果在命令行显示结果“我能学好Java语言!”,则JDK环境配置成功。
1.2 Android SDK的安装及配置1. 解压adt-bundle-windows-x86_64-20131030.zip文件,里面的SDK是免安装版。
Android开发之EditText属性详解

Android开发之EditText属性详解1、EditText输入的文字为密码形式的设置(1)通过.xml里设置:把该EditText设为:android:password="true" // 以”.”形式显示文本(2)在代码里设置:通过设置EditText的setTransformationMethod()方法来实现隐藏密码或这显示密码。
editText.setTransformationMethod(PasswordTransformationMethod.getInstance());//设置密码为不可见。
2、(1)EditText输入的文字为电话号码Android:phoneNumber=”true” //输入电话号码3、EditText字数限制的设置(1)在.xml中设置:android:maxLength=“50”(2)代码中设置:editText.setFilters(new InputFilter[]{newInputFilter.LengthFilter(100)});4、EditText设置字体android:typeface="monospace" //设置字型。
字形有:normal, sans, serif,monospace5、EditText是否可编辑Android:editable // 是否可编辑6、在EditText中软键盘的调起、关闭(1)EditText有焦点(focusable为true)阻止输入法弹出editText=(EditText)findViewById(R.id.txtBody);editText.setOnTouchListener(new OnTouchListener(){public boolean onTouch(View v, MotionEvent event){editText.setInputType(InputType.TYPE_NULL); //关闭软键盘return false;}});(2)当EidtText无焦点(focusable=false)时阻止输入法弹出InputMethodManager imm =(InputMethodManager)getSystemService(INPUT_METHOD_SERVICE);imm.hideSoftInputFromWindow(editText.getWindowToken(),0);(3)调用数字键盘并设置输入类型和键盘为英文etNumber.setInputType(InputType.TYPE_CLASS_NUMBER); //调用数字键盘rlEditText.setInputType(InputType.TYPE_TEXT_FLAG_MULTI_LINE);//设置输入类型和键盘为英文或者:android:inputType="textUri|textMultiLine"(4)android:focusable="false"//键盘永远不会弹出<activity android:name=".AddLinkman"android:windowSoftInputMode="adjustUnspecified|stateHidden"/>//不自动弹出键盘//关闭键盘(比如输入结束后执行)InputMethodManager imm =(InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(etEditText.getWindowToken(), 0);//自动弹出键盘((InputMethodManager)getSystemService(INPUT_METHOD_SERVICE)).toggleSoftInput(0,InputMethodManager.HIDE_NOT_ALWAYS);etEditText.requestFocus();//让EditText获得焦点,但是获得焦点并不会自动弹出键盘7、android:layout_gravity和android:gravity的区别(1)android:layout_gravity是本元素对父元素的重力方向。
Android中ImageButton自定义按钮的按下效果的代码实现方法

【原创】Android中ImageButton自定义按钮的按下效果的代码实现方法,附网上2种经典解决方法。
首先看看网上的2种方法:【以下为引用网络,来源:/thread-7931-1-1.html】使用Button时为了让用户有“按下”的效果,有两种实现方式:1.在代码里面。
view plaincopy to clipboardprint?imageButton.setOnTouchListener(new OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_DOWN){//更改为按下时的背景图片v.setBackgroundResource(R.drawable.pressed);}else if(event.getAction() == MotionEvent.ACTION_UP){//改为抬起时的图片v.setBackgroundResource(R.drawable.released);}return false;}});imageButton.setOnTouchListener(new OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_DOWN){//更改为按下时的背景图片v.setBackgroundResource(R.drawable.pressed);}else if(event.getAction() == MotionEvent.ACTION_UP){//改为抬起时的图片v.setBackgroundResource(R.drawable.released);}return false;}});imageButton.setOnTouchListener(new OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_DOWN){//更改为按下时的背景图片v.setBackgroundResource(R.drawable.pressed);}else if(event.getAction() == MotionEvent.ACTION_UP){//改为抬起时的图片v.setBackgroundResource(R.drawable.released);}return false;}});imageButton.setOnTouchListener(new OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event) {if(event.getAction() == MotionEvent.ACTION_DOWN){//更改为按下时的背景图片v.setBackgroundResource(R.drawable.pressed);}else if(event.getAction() == MotionEvent.ACTION_UP){//改为抬起时的图片v.setBackgroundResource(R.drawable.released);}return false;}});2.用XML文件实现。
android应用开发帮助文档

本android帮助文档为在学习视频时自己制作比较混乱和粗糙,使用时查找第一页导航,再用word的查找功能进行查找导航页——基础说明——监听器的设置->创建监听器——调用android自带的短信发送功能——Activity的方法和生命周期(创建对话框风格的)——Activity的布局方法--LinearLayout线性--常用标签--TableLayout表格--GridView滑动表格--RelativeLayout相对布局——常用控件--除去title和全屏显示--EditText可输入文本框--RadioGroup和RadioButton单选按钮--Toast提示框--CheckBox多选按钮--ProgressBar进度条--ListView可选列表--MENU菜单控件的使用--Animation动画效果--4种动画效果--动画实现--JAVA中的实现--XMl文件中的实现-- Gallery (走马灯式的)移动选择控件--ImageSwitcher图片显示控件--ImageButton图片按钮控件--AlertDialog提示框——Handler的使用---线程--handler的简单应用--用handler更新ProgressBar进度条--handler与线程--线程之间的数据传递--Bundle对象(大量复杂数据) --Message对象(少量简单)--建立一个新的线程--HandlerThread类——SQLite的使用--SQLiteOpenHelper的方法注:带有下划线的是一些封装--代码的编写的可以直接调用的类,在”帮助文档的链接文件\封装的类”文件--封装的DatabaseHelper类夹中都有保存可以直接导入调用--主java文件--命令行的查询方法——文件下载--文件下载--步骤--在注册文件中注册权限--封装的HttpDownLoad类--在Activity中的调用--访问SDCARD --注册权限--封装的FileUtils类--在Activity文件中的调用——_XML文件的解析--SAX常用接口--XMl文件解析实例--实现ContentHandler接口的类--在Activity中的调用 XMl文件实例aaa.xml——广播机制--android中的广播机制--编写BroadcastReveicer类--创建包含BroadcastReveicer类的java文件--在onReceive中处理收到短消息的事件--AndroidManifest.XML注册文件中注册--代码当中进行注册--Activity中发送广播——WIFI--WIFI网卡的状态--操作WIFI网卡所需要的部分权限--改变WIFI网卡的状态——Socket编程--使用基于TCP协议的Socket--使用基于UDP协议的Socket——ServiceAndroid创建基础:src文件中为包类,其中用于建立activity的java文件res中drawable中为图片和标签layout中为布局文件,用于每个activity.java文件的标签布局AndroidManifest中为注册文件,每一个activity的建立都需要在其中注册代码的编写intent对象(用于在不同activity转换时的监听器设置)ponent name 指定activity2.Action 指定activity的作用3.Data 传送的数据类型4.Extras (额外)传送的键值对创建监听器的关键代码:(在第一个activity中)//创建一个Button监听器class myButtonListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stub//创建一个intent类Intent intent = new Intent();//创建一个键值对intent.putExtra("nexttext", "跳转成功");//创建关联intent.setClass(FirstActivity.this, SecondActivity.class);FirstActivity.this.startActivity(intent);}}在第一个activity中的转换关键标签上绑定监听器:(例在Button标签)(在onCreate中)//在Button上绑定监听器myButton.setOnClickListener(new myButtonListener());在第二个activity中的应用键值对(数据传递):(在onCreate中)//获取键值对Intent intent = getIntent();//获得键值对的值String text = intent.getStringExtra("nexttext");在Activity中调用android自带的短信发送功能的关键代码://调用短信发送功能class myButtonListener implements OnClickListener{public void onClick(View v) {// TODO Auto-generated method stub//发送号码Uri uri = Uri.parse("smsto://0800000123");Intent it = new Intent(Intent.ACTION_SENDTO,uri);//发送内容it.putExtra("sms_body", "the SMS text");startActivity(it);}}Activity的方法和生命周期:--onCreate 一个activity启动时运行(第一次)--onStart 当activity处于可见状态时运行--onResume 当activity可以得到用户焦点时(可以被操作)运行--onPause 当activity处于暂停状态时(例如弹出其他activity而原activity未被完全覆盖),可在此保存数据,以便此activity释放时恢复原状--onStop 当activity完全不可见时--onRestart 当activity未被销毁而在此被调用时--onDestory 当activity被销毁时当调用finish();语句时,Activity被销毁。
dev simplebutton的用法

dev simplebutton的用法SimpleButton是一个Android开发中的按钮控件,用来在用户界面中添加一个按钮并定义其功能和外观。
以下是SimpleButton的用法:1. 在XML布局文件中添加SimpleButton控件:```<android.widget.Buttonandroid:id="@+id/button"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Click Me" />```2. 在Java代码中找到SimpleButton,并为其设置点击事件监听器:```Button button = findViewById(R.id.button);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 处理点击事件的代码}});```3. 根据需要为SimpleButton设置其他属性,如颜色、背景、文字等:```button.setTextColor(Color.RED); // 设置按钮文字颜色button.setBackgroundColor(Color.YELLOW); // 设置按钮背景色button.setText("New Button Text"); // 设置按钮文字```4. 处理SimpleButton的点击事件:```button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {// 处理点击事件的代码}});```以上是SimpleButton的基本用法,可以根据具体需求进行进一步的样式定义和功能添加。
Android开发带图标的按钮

Android开发带图标的按钮除了Android系统自带的Button按钮一万,还提供了带图标的按钮ImageButton。
要制作带图标的按钮,首先要在布局文件中定义ImageButton,然后通过setImageDrawable方法来设置要显示的图标。
注意:我们可以在布局文件中就直接设置按钮的图标,如android:src="@drawable/icon1"我们也可以在程序中设置自定义图标imgbtn3.setImageDrawable(getResources().getDrawable(R.drawable.icon2));我们还可以使用系统自带的图标imgbtn4.setImageDrawable(getResources().getDrawabl(android.R.drawable.sym_call_incoming)) ;设置完按钮的图标后,需要为按钮设置监听setOnClickListener,以此捕获事件并处理下面的例子讲述的是由4个图标按钮组成的布局,其中三个按钮的图标是自定义的,第四个按钮的图标是系统的,当点击按钮1的时候,弹出dialog,当点击按钮2的时候,点击确定后,可以将按钮2的图标变成按钮3的图标,当点击按钮3的时候,按钮3的图标变成了系统打电话的图标,点击按钮4,显示一个提示dialogjava代码:package org.loulijun.imagebutton;import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.content.DialogInterface;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ImageButton;import android.widget.TextView;public class ImageButtonTest extends Activity {/** Called when the activity is first created. */TextView textview;ImageButton imgbtn1;ImageButton imgbtn2;ImageButton imgbtn3;ImageButton imgbtn4;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);textview=(TextView)findViewById(R.id.textview);//分别取得4个ImageButton对象imgbtn1=(ImageButton)findViewById(R.id.imagebutton1);imgbtn2=(ImageButton)findViewById(R.id.imagebutton2);imgbtn3=(ImageButton)findViewById(R.id.imagebutton3);imgbtn4=(ImageButton)findViewById(R.id.imagebutton4);//分别为ImageButton设置图标//imgbtn1已经在main.xml布局中设置了图标,所以就不在这里设置了(设置图标即可在程序中设置,也可在布局文件中设置)imgbtn2.setImageDrawable(getResources().getDrawable(R.drawable.icon));//在程序中设置图标imgbtn3.setImageDrawable(getResources().getDrawable(R.drawable.icon2));imgbtn4.setImageDrawable(getResources().getDrawable(android.R.drawable.sym_call_incoming) );//设置系统图标//下面为各个按钮设置事件监听imgbtn1.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubDialog dialog=new AlertDialog.Builder(ImageButtonTest.this).setTitle("提示").setMessage("我是ImageButton1").setPositiveButton("确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stub//相应的处理操作}}).create();dialog.show();}});imgbtn2.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubDialog dialog=new AlertDialog.Builder(ImageButtonTest.this).setTitle("提示").setMessage("我是ImageButton2,我要使用ImageButton3的图标").setPositiveButton("确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubimgbtn2.setImageDrawable(getResources().getDrawable(R.drawable.icon2));}}).create();dialog.show();}});imgbtn3.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubDialog dialog=new AlertDialog.Builder(ImageButtonTest.this).setTitle("提示").setMessage("我是ImageButton3,我想使用系统打电话的图标").setPositiveButton("确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stubimgbtn3.setImageDrawable(getResources().getDrawable(android.R.drawable.sym_action_call));}}).create();dialog.show();}});imgbtn4.setOnClickListener(new Button.OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubDialog dialog=new AlertDialog.Builder(ImageButtonTest.this).setTitle("提示").setMessage("我是使用的系统图标").setPositiveButton("确定",new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {// TODO Auto-generated method stub//相应的处理操作}}).create();dialog.show();}});}}。
AndroidTextView实现多文本折叠、展开效果

AndroidTextView实现多⽂本折叠、展开效果背景在开发过程中,当我们的需求中包含说说或者评论等内容的展⽰时,我们都会考虑当内容太多时该如何显⽰。
当内容的字数太多,如果全部展⽰出来可能会影响体验效果,但是⼜不能只截取⼀部分内容进⾏展⽰,此时就需要考虑使⽤多⾏显⽰折叠的效果来实现。
效果图:使⽤1.布局⽂件调⽤<LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><com.wiggins.expandable.widget.MoreLineTextViewandroid:id="@+id/tv_more_line_short"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/white"android:padding="@dimen/padding_small"app:clickAll="true"app:textColor="@color/red" /><View style="@style/spaceLine" /><com.wiggins.expandable.widget.expandable.ExpandableTextViewandroid:id="@+id/tv_expandable_short"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/white"android:ellipsize="end"android:padding="@dimen/padding_small"android:textColor="@color/blue"app:allClickable="false"app:contentTextColor="@color/blue"app:isDisplayIcon="false"app:maxCollapsedLines="4" /><View style="@style/spaceLine" /><com.wiggins.expandable.widget.MoreLineTextViewandroid:id="@+id/tv_more_line_long"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/white"android:padding="@dimen/padding_small"app:clickAll="true"app:textColor="@color/red" /><View style="@style/spaceLine" /><com.wiggins.expandable.widget.expandable.ExpandableTextViewandroid:id="@+id/tv_expandable_long"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@color/white"android:ellipsize="end"android:padding="@dimen/padding_small"android:textColor="@color/blue"app:allClickable="false"app:contentTextColor="@color/blue"app:isDisplayIcon="false"app:maxCollapsedLines="4" /></LinearLayout>2.Java⽂件调⽤private void initData() {mTvMoreLineShort.setText(Constant.content1);mTvExpandableShort.setText(Constant.content2);mTvMoreLineLong.setText(Constant.content3);mTvExpandableLong.setText(Constant.content4);}MoreLineTextView使⽤1.在attr.xml中定义属性<declare-styleable name="MoreTextStyle"><!--内容⼤⼩--><attr name="textSize" format="dimension" /><!--内容颜⾊--><attr name="textColor" format="color" /><!--内容默认最⼤⾏数--><attr name="maxLine" format="integer" /><!--展开/收起图标--><attr name="expandIcon" format="reference" /><!--展开/收起动画执⾏时间--><attr name="durationMillis" format="integer" /><!--可点击区域,默认展开/收起区域可点击--><attr name="clickAll" format="boolean" /></declare-styleable>2.是否显⽰折叠效果@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);// 如果没有变化,测量并返回if (!mRelayout || getVisibility() == View.GONE) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);return;}mRelayout = false;super.onMeasure(widthMeasureSpec, heightMeasureSpec);// 内容区域初始显⽰⾏⾼mTvContent.setHeight(mTvContent.getLineHeight() * (mMaxLine > mTvContent.getLineCount() ? mTvContent.getLineCount() : mMaxLine)); mLlExpand.post(new Runnable() {@Overridepublic void run() {// 是否显⽰折叠效果mLlExpand.setVisibility(mTvContent.getLineCount() > mMaxLine ? View.VISIBLE : View.GONE);}});}3.设置显⽰内容/*** @Description 设置显⽰内容*/public void setText(String str) {mRelayout = true;mTvContent.setText(str);setVisibility(TextUtils.isEmpty(str) ? View.GONE : View.VISIBLE);}4.展开/收起动画@Overridepublic void onClick(View v) {if (mTvContent.getLineCount() <= mMaxLine) {return;}isExpand = !isExpand;mTvContent.clearAnimation();final int deltaValue;final int startValue = mTvContent.getHeight();if (isExpand) {deltaValue = mTvContent.getLineHeight() * mTvContent.getLineCount() - startValue;//计算要展开⾼度RotateAnimation animation = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animation.setDuration(mDurationMillis);animation.setFillAfter(true);mIvExpand.startAnimation(animation);mTvExpand.setText(getContext().getString(R.string.collapse));} else {deltaValue = mTvContent.getLineHeight() * mMaxLine - startValue;//为负值,收缩的⾼度RotateAnimation animation = new RotateAnimation(180, 0, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); animation.setDuration(mDurationMillis);animation.setFillAfter(true);mIvExpand.startAnimation(animation);mTvExpand.setText(getContext().getString(R.string.expand));}Animation animation = new Animation() {protected void applyTransformation(float interpolatedTime, Transformation t) {//interpolatedTime:为当前动画帧对应的相对时间,值总在0-1之间,原始长度+⾼度差*(从0到1的渐变)即表现为动画效果mTvContent.setHeight((int) (startValue + deltaValue * interpolatedTime));}};animation.setDuration(mDurationMillis);mTvContent.startAnimation(animation);}ExpandableTextView使⽤1.在attr.xml中定义属性<declare-styleable name="ExpandableTextView"><!--内容默认最⼤⾏数,超过隐藏--><attr name="maxCollapsedLines" format="integer" /><!--展开/收起动画执⾏时间--><attr name="animDuration" format="integer" /><!--展开图⽚--><attr name="expandDrawable" format="reference" /><!--收起图⽚--><attr name="collapseDrawable" format="reference" /><!--内容颜⾊--><attr name="contentTextColor" format="color" /><!--内容⼤⼩--><attr name="contentTextSize" format="dimension" /><!--收起/展开颜⾊--><attr name="collapseExpandTextColor" format="color" /><!--收起/展开⼤⼩--><attr name="collapseExpandTextSize" format="dimension" /><!--收起⽂字--><attr name="textCollapse" format="string" /><!--展开⽂字--><attr name="textExpand" format="string" /><!--可点击区域,默认展开/收起区域可点击--><attr name="allClickable" format="boolean" /><!--是否显⽰展开/收起图标,默认显⽰--><attr name="isDisplayIcon" format="boolean" /><!--收起/展开位置,默认左边--><attr name="collapseExpandGrarity"><flag name="left" value="3" /><flag name="right" value="5" /></attr><!--收起/展开图标位置,默认右边--><attr name="drawableGrarity"><flag name="left" value="3" /><flag name="right" value="5" /></attr></declare-styleable>2.是否显⽰折叠效果@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// 如果没有变化,测量并返回if (!mRelayout || getVisibility() == View.GONE) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);return;}mRelayout = false;// Setup with optimistic case// i.e. Everything fits. No button neededmLlExpand.setVisibility(View.GONE);mTvContent.setMaxLines(Integer.MAX_VALUE);// Measuresuper.onMeasure(widthMeasureSpec, heightMeasureSpec);//如果内容真实⾏数⼩于等于最⼤⾏数,不处理if (mTvContent.getLineCount() <= mMaxCollapsedLines) {return;}// 获取内容tv真实⾼度(含padding)mTextHeightWithMaxLines = getRealTextViewHeight(mTvContent);// 如果是收起状态,重新设置最⼤⾏数if (mCollapsed) {mTvContent.setMaxLines(mMaxCollapsedLines);}mLlExpand.setVisibility(View.VISIBLE);// Re-measure with new setupsuper.onMeasure(widthMeasureSpec, heightMeasureSpec);if (mCollapsed) {// Gets the margin between the TextView's bottom and the ViewGroup's bottommTvContent.post(new Runnable() {@Overridepublic void run() {mMarginBetweenTxtAndBottom = getHeight() - mTvContent.getHeight();}});// 保存这个容器的测量⾼度mCollapsedHeight = getMeasuredHeight();}}3.设置显⽰内容/*** @Description 设置显⽰内容*/public void setText(CharSequence text) {mRelayout = true;mTvContent.setText(text);setVisibility(TextUtils.isEmpty(text) ? View.GONE : View.VISIBLE);}4.展开/收起动画@Overridepublic void onClick(View view) {if (mLlExpand.getVisibility() != View.VISIBLE) {return;}mCollapsed = !mCollapsed;// 修改收起/展开图标、⽂字setDrawbleAndText();// 保存位置状态if (mCollapsedStatus != null) {mCollapsedStatus.put(mPosition, mCollapsed);}// 执⾏展开/收起动画mAnimating = true;ValueAnimator valueAnimator;if (mCollapsed) {valueAnimator = new ValueAnimator().ofInt(getHeight(), mCollapsedHeight);} else {mCollapsedHeight = getHeight();valueAnimator = new ValueAnimator().ofInt(getHeight(), getHeight() + mTextHeightWithMaxLines - mTvContent.getHeight()); }valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {int animatedValue = (int) valueAnimator.getAnimatedValue();mTvContent.setMaxHeight(animatedValue - mMarginBetweenTxtAndBottom);getLayoutParams().height = animatedValue;requestLayout();}});valueAnimator.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animator) {}@Overridepublic void onAnimationEnd(Animator animator) {// 动画结束后发送结束的信号,清除动画标志mAnimating = false;// 通知监听if (mListener != null) {mListener.onExpandStateChanged(mTvContent, !mCollapsed);}}@Overridepublic void onAnimationCancel(Animator animator) {}@Overridepublic void onAnimationRepeat(Animator animator) {}});valueAnimator.setDuration(mAnimationDuration);valueAnimator.start();}项⽬地址☞以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
《Android应用开发教程 第2版》课后习题参考答案

《Android应用开发教程第2版》课后习题参考答案第一章1.主流的Android版本有哪些,各有何特点?Android最早的一个发布版本开始于2007年11月的Android 1.0 beta,其后发布了多个更新版本。
这些更新版本都在前一个版本的基础上修复了bug并且添加了前一个版本所没有的新功能。
从2009年4月开始,Android操作系统改用甜点来作为版本代号,这些版本按照大写字母的顺序来进行命名:纸杯蛋糕(Cupcake)、甜甜圈(Donut)、闪电泡芙(Éclair)、冻酸奶(Froyo)、姜饼(Gingerbread)、蜂巢(Honeycomb)﹑冰激凌三明治(Ice Cream Sandwich)、雷根糖(Jelly Bean)、奇巧(KitKat)、棒棒糖(Lollipop)、棉花糖(Marshmallow)、牛轧糖(Nougat)、奥利奥(Oreo )、馅饼(Pie)等。
此外,Android操作系统还有两个预发布的内部版本,它们分别是铁臂阿童木(Astro)和发条机器人(Bender)。
2.Android的系统结构如何?由里向外有如下几层:1.Linux Kernel(Linux内核)Android是在Linux2.6的内核基础之上运行的,提供核心系统服务:安全、内存管理、进程管理、网络组、驱动模型。
2.Android Runtime(Android运行时)内核之上是核心库和一个叫做Dalvik的JAVA虚拟机。
核心库提供了Java语言核心库中包含的大部分功能,虚拟机负责运行程序。
3.Libraries(库)Android提供了一组C/C++库,它们为平台的不同组件所使用。
开发人员通过Application Framework来使用这些库所提供的不同功能。
4.Application Framework(应用程序框架)无论Android提供的应用程序还是开发人员自己编写的应用程序,都需要使用到Application Framework。
如何使用Android的图像识别和二维码识别功能进行开发(三)

Android是目前最流行的移动操作系统之一,拥有庞大的用户群体和丰富的应用开发资源。
在Android开发中,图像识别和二维码识别功能已经成为了热门的技术,为应用程序的开发增添了更多的可能性。
本文将介绍如何使用Android的图像识别和二维码识别功能进行开发。
一、图像识别功能的开发1. 图像识别原理图像识别是通过分析和处理图像中的信息,来识别出图像中的物体或特定的内容。
在Android开发中,可以利用Google提供的Vision API来实现图像识别功能。
Vision API使用机器学习的算法,可以识别出图像中的物体、文字等。
2. 集成Vision API要使用Vision API,首先需要在项目中引入Google Play服务库。
然后,在项目的文件中添加如下依赖项:```javaimplementation ':play-services-vision:'```接下来,在需要使用图像识别功能的地方,可以通过以下代码创建一个Vision API的实例:```javaGoogleApiClient mGoogleApiClient = new (this).addApi().build();();```3. 图像识别功能的实现在通过Vision API创建实例后,就可以使用该实例进行图像识别了。
例如,可以通过以下代码来实现在拍照后识别图像中的物体:```java// 创建一个Detector对象BarcodeDetector barcodeDetector = new (context).build();// 加载要识别的图像Bitmap bitmap = (imagePath);// 创建一个Frame对象Frame frame = new ().setBitmap(bitmap).build();// 识别图像中的内容SparseArray<Barcode> barcodes = (frame);// 获取识别结果if (() > 0) {Barcode barcode = (0);String barcodeValue = ;// 处理识别结果...}```二、二维码识别功能的开发1. 二维码识别原理二维码是一种编码方式,通过将信息以黑白像素点的方式编码成图形,从而实现信息的存储和识别。
《移动智能终端应用开发(Android)》课程设计题目

《移动智能终端应用开发(Android)》课程设计对象:福建师范大学信息技术学院13级软件工程专业时间:2014-2015第1学期选题一:一、课程设计题目:闲置物品助手二、课题难度:中三、系统功能描述:设计实现基于Android的“闲置物品助手”,用于帮助用户记忆物品的存放地方。
生活中的各种各样的物品繁多,有时突然想找一件小东西,却无论如何也找不到,哪怕翻箱倒柜,连楼下的垃圾堆也找遍了也未能如愿;也可能你过几天不经意就看到了你要找的东西。
有时还会因此而误事,比如:要去考试,准考证却找不到了。
因此我们准备开发一款单机版手机App软件, 让你随时登记你的物品放哪儿了,让你随时找到想找的物品,让生活更方便。
本系统主要功能如下:1)物品类别的管理(包括增加、删除、修改和物品类别数量的统计)2)放置位置的管理(包括增加、删除和修改)3)提醒类别管理(包括增加、删除和修改)4)物品的管理(包括增加、删除和修改),关键信息包括:物品放置时间,物品名称、件数、重要性指数、存放位置拍照,是否提醒(例如:某个时间点要取该物品还给某人提前一天提醒我,快到时间1个小时再次提醒;被子放在柜子里超过3个月了,今天是晴天,提醒我是否考虑要晾晒;)5)根据物品名称和类别搜索物品的功能6)根据放置位置和物品名称搜索物品7)身份注册和身份验证功能8)天气系统(主要用到天气预报、城市API设置和网络通信服务)四、系统设计要求:1)开发平台Winxp/win7/win8/win10/vista/win2003server,Eclipse及ADT。
2)数据库:SQLite3)JDK1.74)Android版本2.3.3~4.35)可自行对本课题基本需求进行扩展,但需包含本课题所要求的基本功能。
6)建议项目开发时搭建SVN进行版本管理,也便于团队开发.7)目标设备:android手机或android平板五、关键技术:Activity、Indent、事件、多线程、资源、contentProvider、Service、广播、Gesture、GPs、重力感应、google map, 网络通信、本地存储、多媒体、OPenGL/3D六、重点和难点:Sqlite数据库技术七、补充说明:1)本课题可由1~2人为一个小组,最多2人。
Android Studio项目开发教程 第三章

android:text
要显示的文字。
android:textAllCaps
目前在所有大写的文本。可能的值是“true”或“false”。
android:textColor
文本颜色。可以是一个颜色值,在形式"#rgb", "#argb", "#rrggbb", 和 "#aarrggbb".
android:cursorVisible
使光标可见(默认值)或不可见。默认为false。
android:editable
如果设置为true,指定TextView的一个输入法。
android:fontFamily
字体系列(由字符串命名)的文本。
android:gravity
指定如何排列由视图的x和/或y轴的文本时,该文本比视图小。
android:minHeight
使得TextView中至少有多少像素高。
android:minWidth
使得TextView至少有多少像素宽。
android:password
字段的字符是否显示为密码的点,而不是它们本身。可能的值是“true”或“false”。
android:phoneNumber
android:textSize
大小的文字。文字推荐尺寸类型是“sp”的比例像素(例如:15sp)。
android:textStyle
样式(粗体,斜体,BOLDITALIC)的文本。可以使用以上以“|”分隔。normal - 0bold - 1italic - 2
android:typeface
Andorid智能手机编程-国家开放大学电大易考通考试题目答案

Andorid智能手机编程1、< TableRow >标签代表布局中的:A. 表格B. 行C. 列D. 备注正确答案:B2、布局组件距离上边框存在间隔的参数是android:layout_marginTopA. 对B. 错正确答案:A3、在SQLite数据库中,插入数据库记录可以采用的方法是:A. getWritableDatabase()B. ReadableDatabase()C. getWritableDatabase().execSQL()D. getReadableDatabase()正确答案:C4、Java语言的基础数据类型包括()。
A. byteB. shortC. floatD. boolean正确答案:A B C D5、当启动新Activity时,需从新开启的Actiivty返回时,获取数据的运行代码是:startActivityForResultA. 对B. 错正确答案:A6、若LinearLayout的orientation参数是vertical ,则此布局为横向排列A. 对B. 错正确答案:B7、Java数据类型从大的方面分为两个部分:()和对象数据类型。
A. 基本数据类型B. 过程数据类型C. 自定义数据类型D. 无定义数据类型正确答案:A8、相对布局代码标签为RelativeLayoutA. 对B. 错正确答案:A9、getReadableDatabase()方法,可以获取一个用于操作数据库的SQLiteDatabase实例的说法是否正确?A. 对B. 错正确答案:A10、在Layout文件的ImageButton中,连接显示"play"图片的代码为:A. android:src="@drawable/play"B. android:src="play"C.android:src="connect" D. ImageButton正确答案:A11、MediaPlayer对象的start()方法作用,正确的是:在媒体播放器播放媒体资源A. 对B. 错正确答案:A12、下列关于service服务,描述正确的是()A. 手动调用stopService()后,service不会自动调用内部方法onDestroy()方法B. 手动调用stopService()后,service会自动调用内部方法stop()方法C. 手动调用stopService()后,service会自动调用内部方法finish()方法D. 手动调用stopService()后,service会自动调用内部方法onDestroy()方法正确答案:D13、在页面布局中,CheckBox是多选框A. 对B. 错正确答案:A14、若布局文件代码 < ? xml version="1.0" encoding="utf-8" ? >,表示此文件编码规则为。
中山大学android手机平台开发期末必备代码!

实验3(Button程序设计)(触发文字改变、循环改变图片、动态添加按钮)public class Ex03Activity extends Activity {private Button mBtn;private TextView mTxt;private ImageButton mImageBtn;boolean flag=true;private Button mBtn1;private Context mContext;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);mTxt = (TextView)findViewById(R.id.txtHelloWorld);mBtn = (Button)findViewById(R.id.Btn1);O nClickListener Btn1_Listener = new OnClickListener(){public void onClick(View v){mTxt.setText("按下了"+String.valueOf(((Button)v).getText()));}};m Btn.setOnClickListener(Btn1_Listener);m ImageBtn = (ImageButton)findViewById(R.id.ImageBtn2);O nClickListener ImageBtn2_Listener = new OnClickListener(){public void onClick(View v){if(flag){mImageBtn.setImageDrawable(getResources().getDrawable(R.drawable.state2));flag=false;}else{mImageBtn.setImageDrawable(getResources().getDrawable(R.drawable.state1));flag=true;}}};m ImageBtn.setOnClickListener(ImageBtn2_Listener);m Context = this;mBtn1=new Button(mContext);mBtn1.setText("动态添加按钮");LinearLayout mLinearLatout=(LinearLayout)findViewById(R.id.dongtai);m LinearLatout.addView(mBtn1);O nClickListener mBtn1_Listener = new OnClickListener(){public void onClick(View v){Toast toast = Toast.makeText(mContext, "动态添加按钮", Toast.LENGTH_LONG);toast.setGravity(Gravity.CENTER_VERTICAL, 0, 0);toast.show();}};m Btn1.setOnClickListener(mBtn1_Listener);}}(输入帐号密码触发图像改变)public class MainActivity extends Activity {private ImageButton but1;private Button but2;private EditText user;private EditText password;private Context mContext;private TextView text;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);mContext = this;text=new TextView(mContext);text.setText("动态添加TextView");LinearLayout mLinearLatout=(LinearLayout)findViewById(R.id.out);mLinearLatout.addView(text);but1=(ImageButton)findViewById(R.id.imageButton1);OnClickListener imageButton1_Listener = new OnClickListener(){public void onClick(View v){user=(EditText)findViewById(R.id.editText1);password=(EditText)findViewById(R.id.editText2);if((user.getText().toString().equals("android"))&&(password.getText().toString().equa ls("b403")))but1.setImageDrawable(getResources().getDrawable(R.drawable.ex03state1));elsebut1.setImageDrawable(getResources().getDrawable(R.drawable.ex03state2));}};but1.setOnClickListener(imageButton1_Listener);but2=(Button)findViewById(R.id.button2);user=(EditText)findViewById(R.id.editText1);password=(EditText)findViewById(R.id.editText2);OnClickListener Button2_Listener = new OnClickListener(){public void onClick(View v){but1.setImageDrawable(getResources().getDrawable(drawable.sym_def_app_icon));user.setText("");password.setText("");}};but2.setOnClickListener(Button2_Listener);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_main, menu);return true;}}(动态添加电话号码)public class MainActivity extends Activity implements OnClickListener { private Button button;private EditText numberText;public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);//获取最外层的LinearLayoutLinearLayout outter = (LinearLayout) findViewById(R.id.LinearLayout1);//循环嵌套添加12个按钮for (int i = 0; i < 4; i++) {//每3个按钮动态添加一层水平的LinearLayoutLinearLayout inner = new LinearLayout(this);inner.setOrientation(LinearLayout.HORIZONTAL);inner.setLayoutParams((new youtParams(youtParams.FILL_PARENT,youtParams.WRAP_CONTENT)));//在每个内层的LinearLayout添加3个按钮for (int j = 1; j <= 3; j++) {button = new Button(this);if (i < 3)button.setText("" + (i * 3 + j));else if (j == 1)button.setText("*");else if (j == 2)button.setText("0");elsebutton.setText("#");//设置每个按钮的大小,使其平均分配一层空间button.setLayoutParams(new youtParams(youtParams.FILL_PARENT,youtParams.WRAP_CONTENT, 1));inner.addView(button);button.setOnClickListener(this);}outter.addView(inner);}//增加清除按钮button = new Button(this);button.setText("清除");outter.addView(button);button.setOnClickListener(this);}public void onClick(View v) {//获取按钮按下前的号码数值numberText=(EditText) findViewById(R.id.editText1);numberText.setCursorVisible(false);//若按下清空按钮,清除号码栏if (((Button) v).getText().equals("清除"))numberText.setText("");//否则在后面加上该按钮上的数字elsenumberText.setText(numberText.getText().toString()+ ((Button) v).getText().toString());}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.activity_main, menu);return true;}}实验4(Intent、Bundle的使用以及ListView的应用)(页面跳转,实现一个列表:张三李四王五......)(不要忘记在Manifest中注册所有新建的activity!!!)T extActivity.javapublic class TestActivity extends Activity {private List<Map<String, String>> mDataList= new ArrayList<Map<String, String>>();private void setData() {Map<String, String> map = new HashMap<String, String>();map.put("name", "张三");map.put("class", "数媒");mDataList.add(map);map = new HashMap<String, String>();map.put("name", "李四");map.put("class", "通软");mDataList.add(map);map = new HashMap<String, String>();map.put("name", "王五");map.put("class", "计应");mDataList.add(map);map = new HashMap<String, String>();map.put("name", "朱六");map.put("class", "嵌软");mDataList.add(map);map = new HashMap<String, String>();map.put("name", "卓七");map.put("class", "电政");mDataList.add(map);}/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);ListView mListView = (ListView) findViewById(R.id.listView1);setData();SimpleAdapter listItemAdapter = new SimpleAdapter(this, mDataList,yout.listview_item, new String[] { "name", "class" },new int[] { R.id.item_name, R.id.item_class });mListView.setAdapter(listItemAdapter);OnItemClickListener mItemClickListener=new OnItemClickListener(){@Overridepublic void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {Bundle bundle = new Bundle();bundle.putString("itemName",mDataList.get(arg2).get("name"));bundle.putString("itemClass",mDataList.get(arg2).get("class"));Intent intent=new Intent();intent.setClass(TestActivity.this, informationActivity.class);intent.putExtras(bundle);startActivity(intent);finish();}};mListView.setOnItemClickListener(mItemClickListener);}}informationActivity.javapublic class informationActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(rmation);TextView text=(TextView) findViewById(r);Bundle bundle=this.getIntent().getExtras();String name=bundle.getString("itemName");String Class=bundle.getString("itemClass");text.setText(name+"的所在班级是"+Class);Button button=(Button) findViewById(R.id.back);OnClickListener Button_Listener = new OnClickListener(){public void onClick(View v){Intent intent=new Intent();intent.setClass(informationActivity.this, TestActivity.class);startActivity(intent);finish();}};button.setOnClickListener(Button_Listener);}}Layout文件main.xmlinformation.xmllistview_item.xml实验5(Broadcast)(发送广播范例,不要忘记在Manifest中注册所有新建的activity!!!)Ex05testActivity.javapublic class Ex05testActivity extends Activity {/** Called when the activity is first created. */private boolean isRegister;private static final String BROADCAST_CONTENT = "SYSU_ANDROID_2012";private BroadcastReceiver receiver = new BroadcastReceiver(){private Notification notification;private NotificationManager manager;@Overridepublic void onReceive(Context context, Intent intent) {String action = intent.getAction();if(action.equals(BROADCAST_CONTENT)){showNotification();}}private void showNotification() {notification = new Notification();manager = (NotificationManager)getSystemService(NOTIFICATION_SERVICE);notification.icon = R.drawable.ic_launcher;notification.tickerText = "来自实验五的通知";//下一句实现震动,可以去掉,如果要加上的话需要在布局文件中加上//<uses-permission android:name="android.permission.VIBRATE"/>震动权限//notification.defaults = Notification.DEFAULT_VIBRATE;Bundle bundle = new Bundle();bundle.putString("Name","实验五");bundle.putString("Massage",BROADCAST_CONTENT);PendingIntent pendingIntent;Intent intent = new Intent(Ex05testActivity.this,NotificationActivity.class);intent.putExtras(bundle);pendingIntent = PendingIntent.getActivity(Ex05testActivity.this, 0, intent, 0);notification.setLatestEventInfo(Ex05testActivity.this, "你的通知", "详细电击进入", pendingIntent);manager.notify(0,notification);}};@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);Button reg = (Button)findViewById(R.id.button1);Button sen = (Button)findViewById(R.id.button2);Button can = (Button)findViewById(R.id.button3);OnClickListener register = new OnClickListener(){@Overridepublic void onClick(View v) {if(!isRegister){IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(BROADCAST_CONTENT);registerReceiver(receiver,intentFilter);isRegister = true;}}};OnClickListener send = new OnClickListener(){@Overridepublic void onClick(View v) {Intent intent = new Intent(BROADCAST_CONTENT);sendBroadcast(intent);}};OnClickListener cancel = new OnClickListener(){@Overridepublic void onClick(View v) {if(isRegister){unregisterReceiver(receiver);isRegister = false;}}};reg.setOnClickListener(register);sen.setOnClickListener(send);can.setOnClickListener(cancel);}}Notification.javapublic class NotificationActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.notification);TextView f=(TextView) findViewById(R.id.from);TextView m=(TextView) findViewById(R.id.message);Bundle bundle=this.getIntent().getExtras();String name=bundle.getString("Name");String mas=bundle.getString("Massage");f.setText("信息来自于:"+name);m.setText("内容:"+mas);}}Layout文件main.xml notification.xml 静态注册一个receiver(本例中SmsReceiver),在布局文件中(application中)添加:其中的<action.../>语句要换成:实验6(AppWidget)Ex06Widget.javapublic class EX06Widget extends AppWidgetProvider{public static Time time = new Time();private static Timer timer = new Timer();private static TimerTask task;public static void updateAppWidget(Context context, AppWidgetManager appWidgetManager){RemoteViews remoteView = newRemoteViews(context.getPackageName(),yout.widget_main);time.setToNow();String timeStr=time.format("%Y-%m-%d %H:%M:%S %z");remoteView.setTextViewText(R.id.textView1, timeStr);appWidgetManager.updateAppWidget(new ComponentName(context,EX06Widget.class),remoteView);}private class CountDownTimeTask extends TimerTask{AppWidgetManager appWidgetManager;Context context;public CountDownTimeTask(Context context,AppWidgetManager appWidgetManager){ this.context = context;this.appWidgetManager = appWidgetManager;}@Overridepublic void run() {updateAppWidget(context,appWidgetManager);}}@Overridepublic void onUpdate(Context context,AppWidgetManager appWidgetManager,int[] appWidgetlds){Log.i("EX06","onUpdate");if(task==null){task = new CountDownTimeTask(context,appWidgetManager);timer.schedule(task, 1, 1000);}RemoteViews remoteView2 = newRemoteViews(context.getPackageName(),yout.widget_main);PendingIntent pendingIntentClick = PendingIntent.getActivity(context, 0, clickIntent, 0);remoteView2.setOnClickPendingIntent(R.id.button1, pendingIntentClick);appWidgetManager.updateAppWidget(appWidgetlds,remoteView2);}@Overridepublic void onDisabled(Context context){Log.i("EX06","onDisabled");if(task != null){task.cancel();task = null;}else{Log.i("TAG","task id null");}super.onDisabled(context);}@Overridepublic void onDeleted(Context context, int[] appWidgetIds) {Log.i("EX06","onDeleted");super.onDeleted(context, appWidgetIds);}@Overridepublic void onEnabled(Context context) {Log.i("EX06","onEnabled");super.onEnabled(context);}@Overridepublic void onReceive(Context context, Intent intent) {Log.i("EX06","onReceive");super.onReceive(context, intent);}}Ex06Setting.javapublic class EX06Setting extends Activity{Spinner timezoneSpinner;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.setting);timezoneSpinner=(Spinner) findViewById(R.id.tzspinner);findViewById(R.id.OKbutton).setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {String tz=(String)timezoneSpinner.getSelectedItem();EX06Widget.time.switchTimezone(tz);finish();}});}}Layout文件set.xml widgetlayout.xml注意在布局文件中注册Ex06testWidget的方法比较特殊!!~(如下)实验7服务与多线程(Service and handle)Controler.javapublic class Controler extends Activity {private Context mContext;private Button ibtnPlay;private Button ibtnStop;private Button Exit;private ServiceConnection sc;private MBinder mBinder;private MService mService;private TextView text,stateText,dText;private Handler handler = new Handler();private Runnable r;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(yout.main);// text.setText(mService.getDate());mContext = this;ibtnPlay = (Button) findViewById(R.id.button1);ibtnStop = (Button) findViewById(R.id.button2);Exit = (Button) findViewById(R.id.button3);text = (TextView) findViewById(R.id.text);stateText = (TextView)findViewById(R.id.text2);dText = (TextView)findViewById(R.id.text3);ibtnPlay.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubr = new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubhandler.postDelayed(r, 1000);// 一秒后再次更新// t = mPlayer.getCurrentPosition() / 1000;text.setText(mService.getDate());// System.out.print(true);}};handler.post(r);dText.setText(mService.getDuration());Intent i = new Intent(Controler.this, MService.class);i.putExtra("action", "play");if (mService.IsPlaying()) {stateText.setText("已停止 "+mService.getFileName());ibtnPlay.setText("播放");} else {stateText.setText(" 正在播放"+mService.getFileName());ibtnPlay.setText("暂停");}startService(i);}});ibtnStop.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stub// mService.onStop();Intent i = new Intent(Controler.this, MService.class);i.putExtra("action", "stop");startService(i);ibtnPlay.setText("播放");stateText.setText("已停止 "+mService.getFileName());}});Exit = (Button) findViewById(R.id.button3);Exit.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View arg0) {// TODO Auto-generated method stubIntent i = new Intent(mContext, MService.class);stopService(i);finish();}});sc = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) { /**XXXservice =* (MyService.MyBinder) service;*/mBinder = (MService.MBinder) service;mService = mBinder.getService();if (mService.IsPlaying()) {ibtnPlay.setText("暂停");} else {ibtnPlay.setText("播放");}}Ex07Activity.javapublic class Ex07Activity extends Activity {/** Called when the activity is first created. */Button play,stop,exit;TextView text,text1;MediaPlayer mPlayer=new MediaPlayer();private Handler handler=new Handler();private int t=0;private Runnable r=new Runnable(){@Overridepublic void run(){handler.postDelayed(r, 1000);//一秒后更新t=mPlayer.getCurrentPosition()/1000;text.setText(""+t);}};@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);text=(TextView)findViewById(R.id.text);text1=(TextView)findViewById(R.id.text2);//初始化,就绪try{mPlayer.setDataSource("/mnt/sdcard/mayday_test.mp3");mPlayer.prepare();}catch (IOException e){e.printStackTrace();}play =(Button) findViewById(R.id.button1);play.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {handler.post(r);// TODO Auto-generated method stub//开始播放和暂停if (mPlayer.isPlaying()){mPlayer.pause();play.setText("播放");}else {mPlayer.start();play.setText("暂停");}}});stop=(Button) findViewById(R.id.button2);stop.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {text.setText("00:00");// TODO Auto-generated method stubhandler.removeCallbacks(r);mPlayer.stop();//停止//handler.post(r);try{mPlayer.prepare();//停止后必须重新就绪,否则无法再次开始}catch(IOException e){e.printStackTrace();}play.setText("播放");}});exit = (Button) findViewById(R.id.button3);exit.setOnClickListener(new OnClickListener(){@Overridepublic void onClick(View v) {// TODO Auto-generated method stubonDestroy();Ex07Activity.this.finish();}});}}MService.javapublic class MService extends Service {public final IBinder binder = new MBinder();MediaPlayer mPlayer = new MediaPlayer();private TextView text;private String fname;private Integer temp = 0;boolean flag = true;@Overridepublic IBinder onBind(Intent arg0) {// TODO Auto-generated method stubreturn binder;}public class MBinder extends Binder {/*** 添加额外的方法让activity获得Service的信息最简单是直接获得service引用 */public MService getService() {return MService.this;}}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();fname = "/mnt/sdcard/mayday_test.mp3";try {mPlayer.setDataSource(fname);mPlayer.prepare();} catch (IOException e) {e.printStackTrace();}}@Overridepublic void onStart(Intent intent, int startId) {// TODO Auto-generated method stubsuper.onStart(intent, startId);String action = intent.getStringExtra("action");if (action.equals("play")) {if (mPlayer.isPlaying())mPlayer.pause();elsemPlayer.start();} else if (action.equals("stop")) {mPlayer.stop();try {mPlayer.prepare();} catch (IllegalStateException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public boolean IsPlaying() {// Log.e("Wayne","getIsPlaying");return mPlayer.isPlaying();}public String getDate() {if(flag)if (mPlayer.isPlaying()) {Integer t = mPlayer.getCurrentPosition() / 1000;temp = t;}return toTime(temp);}public String getDuration(){Integer t ;if(flag)t= mPlayer.getDuration()/1000;elset = 0;// Integer a = t/60;return"/"+toTime(t);}private String toTime(Integer i){String d ;if(i<10)d= "0"+i/60+":0"+i%60;else if(i/60<10)if(i%60>=10)d = "0"+i/60+":"+i%60;elsed= "0"+i/60+":0"+i%60;elsed = i/60+":"+i%60;return d;}public String getFileName(){return fname;}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();mPlayer.release();flag = false;}}布局文件main.xml 需要注意布局文件注册方法!!!实验8数据存储(SharedPreferences的使用)MainActivity.javapublic class MainActivity extends Activity {Context context=MainActivity.this;private AutoCompleteTextView CTextView;private SharedPreferences sharePreferences;private Button buttonSave,buttonRead;private EditText editText;private ArrayList<String> getLocalFileNames() {ArrayList<String> nameStr=new ArrayList<String>();sharePreferences = this.getPreferences(MODE_PRIVATE);int count=sharePreferences.getInt("nameCount", 0);for(int i=0;i<count;i++){String currentname=sharePreferences.getString("name"+i, "");nameStr.add(currentname);}return nameStr;}private void updateAdater(){ArrayList<String> nameStr=getLocalFileNames();ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, yout.list_item, nameStr);CTextView=(AutoCompleteTextView) findViewById(R.id.autoCompleteTextView1);CTextView.setAdapter(adapter);}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);updateAdater();buttonSave=(Button)findViewById(R.id.buttonSave);buttonSave.setOnClickListener(SaveListener);buttonRead=(Button)findViewById(R.id.buttonRead);buttonRead.setOnClickListener(ReadListener);}private OnClickListener SaveListener=new OnClickListener(){public void onClick(View v){ArrayList<String> nameStr=getLocalFileNames();editText=(EditText)findViewById(R.id.editText1);String content=editText.getText().toString();String title=CTextView.getText().toString();Properties properties=new Properties();properties.put("content", content);try {FileOutputStream stream=context.openFileOutput(title+".txt", Context.MODE_WORLD_WRITEABLE);properties.store(stream, "content");sharePreferences = ((Activity) context).getPreferences(MODE_PRIVATE);Editor editor=sharePreferences.edit();editor.putInt("nameCount",nameStr.size()+1);editor.putString("name"+nameStr.size(), title);mit();updateAdater();} catch (IOException e) {e.printStackTrace();}}};private OnClickListener ReadListener=new OnClickListener(){public void onClick(View v){String title=CTextView.getText().toString();Properties properties=new Properties();try {FileInputStream stream=context.openFileInput(title+".txt");properties.load(stream);editText=(EditText)findViewById(R.id.editText1);editText.setText(properties.get("content").toString());} catch (IOException e) {e.printStackTrace();}}};}本题的布局(activity_main.xml)(List_view.xml)其它设置长按按钮:listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {public boolean onItemLongClick(AdapterView<?> parent, View v,int p, long id) {final int temp = p;AlertDialog.Builder builder = new AlertDialog.Builder(EX09Activity.this);// 设置标题builder.setTitle("是否删除该成员?");builder.setPositiveButton("是",new DialogInterface.OnClickListener() {public void onClick(DialogInterface dia, int which) {s.delete(idList.get(temp));idList.remove(temp);fillData();}});builder.setNegativeButton("否", null);builder.show();return false;}});。
【Android开发API】用户界面-按钮 - Buttons

需要有图标的按钮,使用
需要有文字和图标的按钮,使用具有
点击事件的响应
当用户点击⼀个按钮时,
为了定义⼀个按钮的点击事件处理程序,在
元素添加< android:onClick>属性。
这个属性的值必须是你要调用的方法响应点击事件的名称。
使用这个布局的<Activity>必须执行相应的方法。
例如,这里有⼀个使用< android:onClick>属性的按钮的布局:
在使用这个布局的<Activity>中,利用下面的方法处理点击事件: /* * Called when the user touches the button * /
public void sendMessage(View view) { // Do something in response to button click }
在< android:onClick>属性声明的方法必须完全按照上面显示。
具体来说,该方法必须:
是公共的
返回void
定义⼀个<View>作为其唯⼀的参数(点击时将会看作这个<View>)
使用监听器 - Using an OnClickListener
布局中。
这可能是必要的,如果你在运行时实例化
对于此Drawable
©eoe
本文链接。
android toast的用法

android toast的用法AndroidToast是Android开发中一种用于显示短暂提示信息的轻量级控件,可以提供简短的信息提示。
Toast是一种非常简单的弹出框,它可以在指定的时间内显示一些简短的消息提示,同时不会影响当前Activity或应用程序的正常运行。
Toast可以是文字,也可以是图片,它具有轻量级的特点,适合用于大多数情况下的短暂的信息提示。
Android Toast的使用Toast的使用非常简单,只需要几行代码就可以轻松实现。
首先要了解Toast的基本方法:1.makeText():根据传入参数创建Toast对象,返回Toast对象;2.show():显示Toast;3.cancel():取消Toast显示;4.setDuration():设置Toast的显示时长;5.setGravity():设置Toast的显示位置;6.setText():设置Toast显示的文字;7.setView():设置Toast显示的图片。
接下来,我们就可以使用这些方法来创建一个Toast,它会在指定的时间内显示一些短暂的消息提示://建一个ToastToast toast = Toast.makeText(context, This is a toast message! Toast.LENGTH_LONG);//置Toast显示的位置toast.setGravity(Gravity.CENTER, 0, 0);//置Toast显示的时长toast.setDuration(Toast.LENGTH_LONG);//示Toasttoast.show();上面代码演示了如何使用上面提到的这些Toast的方法来创建一个Toast,它会在指定的时间内显示一些短暂的消息提示,而不会影响当前Activity或应用程序的正常运行。
Android Toast的优点Toast作为一种简单、轻量级的控件,在Android开发中有着很多优点:1.Toast不会影响当前Activity或应用程序的正常运行,它只会在指定的时间内显示一些短暂的消息提示;2.Toast的实现范围非常广,它可以是文字,也可以是图片;3.Toast可以设置显示的时长,也可以设置显示的位置;4.Toast的显示效果非常直接,可以为用户提供简短的信息提示;5.Toast不会占用太多系统资源,而且它的使用非常简单,只需要几行代码就可以轻松实现。
Android初级-----(基本组件)

第5单元用户界面View (二)(4课时)5.1 常用组件介绍5.1.1 Button按钮5.1.2 TextView文本5.1.3 EditText可编辑文本框5.1.4 RadioGroup RadioButton单选按钮5.1.5 CheckBox复选框5.1.6 ImageView图片框ImageButton 图片按钮5.1.7 DatePicker 日期5.1.8 TimePicker 时间Button按钮点击事件处理:监听事件多种方式使用监听1,xml布局文件中有onClick2,使用匿名内部类3,定义内部监听类4,定义监听类(也可以是本类)EditText可编辑文本框重要属性:1.android:hint=”提示内容”//设置显示在空间上得提示信息2.android:numeric=”123”//设置只能输入整数,如果是小数则是:decimal3.android:singleLine=”true”//设置单行输入,一旦设置为true,则文字不会自动换行4.android:password=”true”//设置只能输入密码5.android:textColor=”#FF8C00”//设置字体颜色6.android:textStyle=”bold”//字体,bold,italic,bolditalic7.android:textSize=”20dip”//大小8.android:capitalize=”characters” //以大写字母写9.android:textAlign=”center”//EditText没有这个属性,但是TextView有,居中10.android:textColorHighlight=”#CCCCCC” //被选中文字的颜色,默认为蓝色11.android:textColorHint=”#FFFF00” // 设置提示信息文字的颜色,默认为灰色12.android:textScaleX=”1.5”//控制字与字之间的间距13.android:typeface=”monospace” //字型normal,sans,serif,monospace14.(等宽字体)15.android:background=”@null” //背景,这里没有,指透明16.android:layout_weight=”1” //权重,控制控件之间的地位,在控制控件显示的大小时蛮有用的。
AndroidUI界面开发详解

Spinner下拉列表控件
Spinner控件用于显示一个下拉列表,该控件在装载数据的时候需要创 建一个Adapter适配器对象。并在创建Adapter对象过程中指定要装 载的数据是数组或者是List对象的数据 实战案例之一 Spinner下拉列表控件
TabHost标签控件
如果在屏幕上要放置很多的控件,可能一个屏放不下,除了使用滚动 视图的方式外,还可以使用标签控件对屏幕进行分页显示,当单击标 签控件的不同标签时,会显示当前标签的内容,在android系统中一 个标签可以是一个View或者是Activity TabHost是标签控件的核心类,也是一个标签的集合,每一个标签是 TabHost.TabSpec对象。通过TabHost类的addTab的方法添加多个 TabHost.TabSpec对象。 实战案例之一 TabHost标签控件显示分页 实战案例之 二 TabHost标签控件显示底端菜单
使用PopupWindow
PopupWindow 可以创建类似对话框风格的窗口,使用 PopupWindow创建对话框风格的窗口只要实现两个步骤即可: 1、调用PopupWindow的构造器创建PopupWindow对象 2、调用PopupWindow的showAsDropDown(View view)方法将 PopupWindow作为view的组件的下拉组件显示出来,或者调用 PopupWindow的showAtLocation方法将PopupWindow在指定的 位置显示出来。 实战案例一: 使用PopupWindow实现对话框的提示
TimerPicker时间与日期控件
TimerPicker输入时间控件用来输入小时和分钟。 TimerPicker默认的 情况下是12小时进制,也可以设置24小时显示。 实战案例一: TimerPicker时间控件的使用
Android开发实现按钮点击切换背景并修改文字颜色的方法

Android开发实现按钮点击切换背景并修改⽂字颜⾊的⽅法本⽂实例讲述了Android开发实现按钮点击切换背景并修改⽂字颜⾊的⽅法。
分享给⼤家供⼤家参考,具体如下:其实原理很简单,⽤到的是selector,⽤来设置android:background和android:textcolor属性,selector可以⽤来设置默认时候、点击时候的背景图⽚和⽂字颜⾊的属性,过程如下:这两个⽂件如下:1.当点击按钮,改变⽂字的颜⾊:<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="/apk/res/android"><item android:state_focused="false" android:state_enabled="true" android:state_pressed="false"android:color="#000000" /><item android:state_enabled="false" android:color="#000000" /><item android:state_pressed="true" android:color="#ffffff" /><item android:state_focused="true" android:color="#000000" /></selector>2.当点击按钮,改变按钮的背景:<?xml version="1.0" encoding="utf-8"?><selector xmlns:Android="/apk/res/android"><!-- 定义按钮按下时的图⽚ --><item Android:drawable="@drawable/blue" Android:state_pressed="true"/><!-- 定义按钮默认的图⽚ --><item Android:drawable="@drawable/gray"/></selector>是不是很简单,不⽤再⽤java代码来进⾏设置,只需要设置到你所需要的Textview或者button,如下使⽤⽅式:<TextViewandroid:id="@+id/menu_logout"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_weight="1"android:background="@drawable/btnselector"android:drawableLeft="@drawable/menu_logout"android:drawablePadding="10dp"android:gravity="center_vertical"android:text="@string/logout"android:textColor="@drawable/btnselectorcolor"android:textSize="@dimen/Menu_Font_Size" />成功完成更多关于Android相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家Android程序设计有所帮助。
Android 自定义View消除锯齿实现图片旋转,添加边框及文字说明

先看看图片的效果,左边是原图,右边是旋转之后的图;之所以把这个写出来是因为在一个项目中需要用到这样的效果,我试过用FrameLayout 布局如上的画面,然后旋转FrameLayout,随之而来也就存在了一些问题——锯齿!在网上搜索之后,有两种方法,一是利用Paint,二是利用Canvas;(1)、paint.setAntiAlias(true);paint.setFlags(Paint.ANTI_ALIAS_FLAG);(2)、DrawFilter pfdf = new PaintFlagsDrawFilter(0,Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG);canvas.setDrawFilter(pfdf);而如果利用paint,或者canvas,需要从哪获取paint/canvas,这也是一个问题;在实现的过程中,尝试过自定义FrameLayout下面的单个View{ImageView,TextView},但都以失败告终,失败的主要问题在于右图下边的文字描述无法和相片边框相对齐,而且用Matrix旋转背景之后背景大小改变,位置也不在最下边,所以就采用了单独实现一个View的方法,主要原因还是因为自身对Canvas绘图及Paint画笔不是很熟悉,所以导致的效率不高;public class RotateTextImageView extends View {PaintFlagsDrawFilter pfdf;Paint paint;Matrix matrix;Bitmap bitmap;int index = -1;private int oriHeight;private int oriWidth;private int newHeight;private int newWidth;private int angle = 5;protected Path path = new Path();private float[] f = new float[8];private int shawHeight = 20;private int borderSize = 8;Bitmap oriBitmap;private String text = "";public RotateTextImageView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle);initCanvasInfo();}public RotateTextImageView(Context context, AttributeSet attrs) { super(context, attrs);initCanvasInfo();}public RotateTextImageView(Context context) {super(context);initCanvasInfo();}/*** 初始化Paint*/protected void initCanvasInfo() {pfdf = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG| Paint.FILTER_BITMAP_FLAG);paint = new Paint();paint.setAntiAlias(true);matrix = new Matrix();matrix.setRotate(5);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);paint.reset();// 消除锯齿paint.setAntiAlias(true);paint.setFlags(Paint.ANTI_ALIAS_FLAG);canvas.setDrawFilter(pfdf);canvas.drawBitmap(bitmap, 0, 0, paint);newHeight = bitmap.getHeight();newWidth = bitmap.getWidth();calculatePoints();// 添加阴影path.reset();path.moveTo(f[0], f[1]);path.lineTo(f[2], f[3]);path.lineTo(f[4], f[5]);path.lineTo(f[6], f[7]);path.close();paint.setStyle(Paint.Style.FILL_AND_STROKE);paint.setColor(Color.parseColor("#96ffffff"));canvas.drawPath(path, paint);// 添加字符if (text != null && !text.equals("")) {path.reset();paint.setTextSize(18);float width = paint.measureText(text);path.moveTo((f[0] + f[2]) / 2, (f[1] + f[3]) / 2);path.lineTo((f[4] + f[6]) / 2, (f[5] + f[7]) / 2);paint.setColor(Color.parseColor("#2b2b2b"));canvas.drawTextOnPath(text, path, (oriWidth - width) / 2, 3, paint);}layout(0, 0, newWidth, newHeight);}/*** 计算坐标值*/private void calculatePoints() {double a = angle * Math.PI / 180;BigDecimal height = new BigDecimal(oriHeight);BigDecimal width = new BigDecimal(oriWidth);BigDecimal cos = new BigDecimal(Math.cos(a));BigDecimal tan = new BigDecimal(Math.tan(a));f[0] = 0;f[1] = height.multiply(cos).floatValue();f[2] = tan.multiply(new BigDecimal(shawHeight)).floatValue();f[3] = (new BigDecimal(f[1])).subtract(new BigDecimal(shawHeight)) .floatValue();f[4] = width.multiply(cos).add(new BigDecimal(f[2])).floatValue();f[5] = new BigDecimal(newHeight - shawHeight).floatValue();f[6] = width.multiply(cos).floatValue();f[7] = new BigDecimal(newHeight).floatValue();}/*** 设置图片** @param bmp*/public void setBitmap(Bitmap bmp) {oriBitmap = bmp;matrix.reset();matrix.setRotate(angle);Bitmap bitmapF = addFrame(bmp);oriHeight = bitmapF.getHeight();oriWidth = bitmapF.getWidth();bitmap = Bitmap.createBitmap(bitmapF, 0, 0, bitmapF.getWidth(),bitmapF.getHeight(), matrix, true);postInvalidate();}/*** 旋转角度** @param angle*/public void setAngle(int angle) {this.angle = angle;setBitmap(oriBitmap);}/*** 设置底部阴影高度** @param shawHeight*/public void setShawHeight(int shawHeight) {this.shawHeight = shawHeight;postInvalidate();}/*** 生成添加了白色边缘的图** @param bmp* @return*/protected Bitmap addFrame(Bitmap bmp) {Bitmap bmpWithBorder = Bitmap.createBitmap(bmp.getWidth() + borderSize* 2, bmp.getHeight() + borderSize * 2, bmp.getConfig());Canvas canvas = new Canvas(bmpWithBorder);canvas.drawColor(Color.WHITE);canvas.drawBitmap(bmp, borderSize, borderSize, null);return bmpWithBorder;}/*** 设置字符串** @param text*/public void setText(String text) {this.text = text;postInvalidate();}/*** 获取字体高度*/protected int getFontHeight() {FontMetrics fm = paint.getFontMetrics();return (int) Math.ceil(fm.descent - fm.top) + 2;}}代码解释:其实没有什么难的东西,只是一些数学运算,代码中每一个方法都有对应的功能注释。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android开发轻松实现带文字的ImageButton
实际上,ImageButton是不能添加文字的。
要实现带文字的ImageButton的方法很多,这里仅列举一种方法:自定义一个继承自ImageButton的类,然后Override它的onDraw(Canvas canvas)方法。
具体步骤如下:
1)新建一个Android工程,例如工程名:TestImageButton。
怎么建工程?不用我多说了吧。
2)新建一个MyImageButton类,继承android.widget.ImageButton
3)为类MyImageButton添加成员函数,详细代码如下:
package ;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.ImageButton;
public class MyImageButton extends ImageButton {
public String text = null; //要显示的文字
public float textX,textY; //文本显示的坐标位置
public int color; //文字的颜色
public MyImageButton(Context context, AttributeSet attrs) { super(context,attrs);
textX=20;
textY=60;
}
//设置需要显示的文本
public void setText(String text){
this.text = text; //设置文字
}
//设置文本显示的颜色
public void setColor(int color){
this.color = color; //设置文字颜色
}
// 设置显示文本的X、Y坐标
public void setPosition(float XX,float YY){
t extX = XX;
t extY = YY;
}
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
Paint paint=new Paint();
paint.setTextAlign(Paint.Align.CENTER);
paint.setColor(color);
canvas.drawText(text, textX, textY, paint); //绘制文字}
}
4)在布局文件中引用:
<?xml version="1.0"encoding="utf-8"?>
<LinearLayout xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:background="#9CFFC1">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
<.MyImageButton
a ndroid:id="@+id/button01"
a ndroid:layout_width="wrap_content"
a ndroid:layout_height="wrap_content"
a ndroid:layout_marginLeft="25dp"
a ndroid:background="@drawable/video1"/>
</LinearLayout>
5)在启动Activity的onCreate方法中添加文字
package ;
import .MyImageButton;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
public class TestImageButtonActivity extends Activity {
/** Called when the activity is first created. */
private MyImageButton button01=null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(yout.main);
button01= (MyImageButton)findViewById(R.id.button01);
button01.setText("视频文件1");
button01.textX =25;
button01.textY =65;
button01.setColor(Color.rgb(147, 48, 4));
}
}
最后,别忘了在工程目录testImageButton\res\drawable-hdpi下放置一个名为video1.png 的图片文件。
程序运行的效果如下:。