Android自定义控件

合集下载

Android中自定义控件TextSize属性问题

Android中自定义控件TextSize属性问题

Android中⾃定义控件TextSize属性问题本⽂主要说明⼀个⾃定义控件添加TextSize属性的坑,刚刚从坑⾥⾯爬出来,写个随笔,记录⼀下;*****************************************************************今天⾃⼰在摸索Android的⾃定义控件,然后给控件添加了⼀个修改字体的属性:<declare-styleable name="BannerView"><attr name="indicator_item_text_size" format="dimension"/></declare-styleable>然后在控件代码中的获取如下:private void init(Context context, AttributeSet attrs, int defStyleAttr) {this.setLayoutParams(new LayoutParams(youtParams.MATCH_PARENT, youtParams.MATCH_PARENT)); View rootView = LayoutInflater.from(context).inflate(yout.banner_view_layout, this, true);currentTV = (TextView) rootView.findViewById(R.id.introduce_tv);TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BannerView, defStyleAttr, 0);indicatorTextSize = typedArray.getDimensionPixelSize(R.styleable.BannerView_indicator_item_text_size, 16);typedArray.recycle();currentTV.setTextSize(indicatorTextSize);}欧了,启动app,结果,狗眼瞎了,⽂字字体⽐预计的要⼤很多,懵逼了!~终于知道为什么了:上⾯那⾏代码改⼀下:currentTV.setTextSize(PLEX_UNIT_PX, indicatorTextSize);看⼀下截图,多么痛的领悟:。

Android自定义Toast宽度无法设置问题解决

Android自定义Toast宽度无法设置问题解决

Android⾃定义Toast宽度⽆法设置问题解决在项⽬中想要实现⼀个头部的toast提⽰效果,类似下图再实现的过程中发现,如果直接通过修改Toast的View布局的⽗控件宽度是⽆法实现效果的,后来是通过直接⽤代码指定⽗控件内部的textview的宽度实现了。

下⾯是具体的代码:private static void makeToast(String msg) {if (toastView == null) {LayoutInflater inflater = (LayoutInflater) AppApplication.getInstance().getSystemService(YOUT_INFLATER_SERVICE);params = new youtParams(AppApplication.mScreenWidth, youtParams.MATCH_PARENT);toastView = inflater.inflate(yout.toast_custom_prompt, null);}TextView tv = (TextView) toastView.findViewById(TitleToast);tv.setLayoutParams(params);tv.setText(msg);toast = new Toast(AppApplication.getInstance());float hOffset = AppApplication.getInstance().getResources().getDimension(mon_title_height);toast.setGravity(Gravity.TOP, 0, (int) hOffset);toast.setDuration(Toast.LENGTH_LONG);toast.setView(toastView);toast.show();}上⾯的⽅式使⽤到了我⾃⼰写的⼀个计算屏幕宽⾼的⼩⽅法:private void calcScreenSize() {DisplayMetrics dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);mScreenWidth = dm.widthPixels;mScreenHeight = dm.heightPixels;AppApplication.mScreenWidth = mScreenWidth;AppApplication.mScreenHeight = mScreenHeight;}通过上⾯的步骤就能在标题栏下⽅显⽰⼀个⾃定义的toast提⽰。

修改preferencecategory的宽高

修改preferencecategory的宽高

修改preferencecategory的宽高如何修改PreferenceCategory 的宽高?PreferenceCategory 是Android 中的一个可自定义的控件,用于在应用程序的设置界面中创建一个可分组的选项类别。

默认情况下,PreferenceCategory 的宽高是自适应的,与包含它的父容器保持一致。

然而,有时候我们可能需要手动修改PreferenceCategory 的宽高,以满足特定的界面设计需求。

接下来,我将一步一步地介绍如何修改PreferenceCategory 的宽高。

步骤一:了解布局文件结构首先,我们需要了解用于显示设置界面的布局文件的结构。

通常,设置界面使用一个或多个PreferenceFragment 来显示相关的设置选项。

PreferenceFragment 是一个特殊的Fragment,它负责加载和管理Preference 的显示。

布局文件通常包含一个包含PreferenceFragment 的容器布局,如FrameLayout 或LinearLayout。

在这个容器布局中,再添加一个或多个PreferenceCategory 控件来创建设置选项的不同类别。

步骤二:定义自定义PreferenceCategory 样式要修改PreferenceCategory 的宽高,我们需要定义一个自定义的样式。

在res/values/styles.xml 文件中,添加以下代码:xml<style name="CustomPreferenceCategory"parent="Preference.Category"><item name="android:layout_width">200dp</item><item name="android:layout_height">50dp</item></style>上述代码中的CustomPreferenceCategory 是我们自定义的样式名称,继承自Preference.Category。

Android自定义View控件实现刷新效果

Android自定义View控件实现刷新效果

Android⾃定义View控件实现刷新效果三种得到LinearInflater的⽅法a. LayoutInflater inflater = getLayoutInflater();b. LayoutInflater localinflater =(LayoutInflater)context.getSystemService(YOUT_INFLATER_SERVICE);c. LayoutInflater inflater = LayoutInflater.from(context);onDraw ⽅法绘图,invalidate刷新界⾯。

效果图:点击⼀下换颜⾊onDraw画完图后,给控件设置点击事件 ,将参数传到控件⾥,然后invalidate刷新1.onDraw画图,并增加changeColor⽅法public class CusView3 extends View {private int color = 0;public CusView3(Context context, AttributeSet attrs) {super(context, attrs);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint mPaint = new Paint();if (color > 2) {color = 0;}switch (color) {case 0:mPaint.setColor(Color.GREEN);break;case 1:mPaint.setColor(Color.RED);break;case 2:mPaint.setColor(Color.BLUE);break;default:break;}mPaint.setStyle(Style.FILL);mPaint.setTextSize(35.0f);canvas.drawText("点击我刷新", 10, 60, mPaint);}public void changeColor() { //为了让外⾯调⽤color++;}}2.布局<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><xue.test.CusView3android:id="@+id/cusview3"android:layout_width="wrap_content"android:layout_height="wrap_content"></xue.test.CusView3></LinearLayout>3.画图后给控件设置点击事件 ,将参数传到控件⾥,然后invalidate刷新public class TestCustomViewActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main);view3 = (CusView3) findViewById(R.id.cusview3);// 点击事件view3.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Message message = new Message();message.what = 1;myHandler.sendMessage(message);}});}Handler myHandler = new Handler() {// 接收到消息后处理public void handleMessage(Message msg) {switch (msg.what) {case 1:// 调⽤⽅法view3.changeColor();// 刷新⽅法view3.invalidate();break;}super.handleMessage(msg);}};private CusView3 view3;}⾄于⾃定义控件占整屏的问题,可能需要⽤layoutparams以上所述是⼩编给⼤家介绍的Android⾃定义View控件实现刷新效果,希望对⼤家有所帮助,如果⼤家有任何疑问欢迎给我留⾔,⼩编会及时回复⼤家的!。

AndroidUI控件RatingBar实现自定义星星评分效果

AndroidUI控件RatingBar实现自定义星星评分效果

AndroidUI控件RatingBar实现⾃定义星星评分效果本⽂实例为⼤家分享了Android RatingBar星星评分效果的具体代码,供⼤家参考,具体内容如下继承关系AppCompatRatingBar效果图xml<RatingBarstyle="@android:style/Widget.DeviceDefault.RatingBar.Small"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:isIndicator="false"android:numStars="5"android:rating="2.5"android:stepSize="0.5"/>上⾯这些属性也可以⽤java代码设置。

点击事件点击事件中可以处理我们⾃⼰的逻辑。

不给ratingbar添加监听,点击他也会变化ratingBar = (RatingBar) findViewById(R.id.ratingBar);ratingBar.setRating(3.5f);ratingBar.setOnRatingBarChangeListener(new RatingBar.OnRatingBarChangeListener() {@Overridepublic void onRatingChanged(RatingBar ratingBar, float rating, boolean fromUser) {if (fromUser) {//fromUser rating数量是否发⽣改变ratingBar.setRating(rating);}Log.d(TAG, "rating=" + ratingBar.getRating());Log.d(TAG, "fromUser=" + fromUser);}});以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

Android自定义SeekBar实现视频播放进度条

Android自定义SeekBar实现视频播放进度条

Android⾃定义SeekBar实现视频播放进度条本⽂实例为⼤家分享了Android实现视频播放进度条的具体代码,供⼤家参考,具体内容如下⾸先来看⼀下效果图,如下所⽰:其中进度条如下:接下来说⼀说我的思路,上⾯的进度拖动条有⾃定义的Thumb,在Thumb正上⽅有⼀个PopupWindow窗⼝,窗⼝⾥⾯显⽰当前的播放时间。

在SeekBar右边有⼀个⽂本框显⽰当前播放时间/总时间。

step1、先来看⼀看PopupWindow的布局⽂件,seek_popu.xml,效果如下图所⽰:<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/seek_dialog_bg" ><!-- 展现当前播放进度时间的⽂本框--><TextViewandroid:id="@+id/dialogSeekTime"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="10dip"android:layout_marginTop="12dip"android:text="@string/unknow_seek_time"android:textColor="@color/black"android:textSize="12sp" /></RelativeLayout>step2、⾃定义⼀个SeekBarimport com.canplay.video.R;import android.content.Context;import android.util.AttributeSet;import youtInflater;import android.view.View;import android.widget.PopupWindow;import android.widget.SeekBar;import android.widget.TextView;/*** ⾃定义进度拖动条控件*/public class MySeekBar extends SeekBar {/*** 定义⼀个展现时间的PopupWindow*/private PopupWindow mPopupWindow;private View mView;/*** 显⽰时间的TextView*/private TextView dialogSeekTime;/*** ⽤来表⽰该组件在整个屏幕内的绝对坐标,其中 mPosition[0] 代表X坐标,mPosition[1] 代表Y坐标。

对Android的整体理解

对Android的整体理解
那么内存溢出出现的大部分原因回事因为图片加载问题:
这时候就涉及到了三级缓存的问题
三级缓存机制: 内存缓存,本地缓存,网络缓存(异步任务)
在内存缓存的时候 会把图片保存在map集合中 由于安卓中默认是强引用
在这个时候 安卓中的垃圾回收机制就没有了作用(每个图片都有一个引用指向着它),
(4).采用监听器监听图片加载过程及相应事件的处理;
(5).配置加载的图片显示选项,比如图片的圆角处理及渐变动画。
需要我们自己去绘画 定义控件该有的界面 以及点击事件其他的
界面维护好后 基本上剩下的就是封装网络请求,解析返回的数据 填充数据 加载图片
当然 可能还会存在一些 内存溢出(内存优化) 应用无响应 等异常 现在先解决一下 内存溢出的问题
内存溢出从源头上说就是内存优化不够 有些该回收 或者重复利用的内存没有回收或者利用
就拿MVC 模型来举例
安卓中主要就分那三大模块
模型(model)对象:是应用程序的主体部分,所有的业务逻辑都应该写在该层。
视图(view)对象:是应用程序中负责生成用户界面的部分。也是在整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。
控制器(control)对象:是根据用户的输入,控制用户界面数据显示及更新model对象状态的部分,控制器更重要的一种导航功能,响应用户出发的相关事件,交给m层处理。
这些都是一些补间动画,并没有改变VIew的真实属性
其他的动画 当然还有属性动画ValueAnimator ViewHelper PropertiAnimator(NineOld包中) 等 差不多 我们常见的动画 就这么多
当然还有一些常用的布局 FrameLayout LinearLayout RelativeLayout

androidstudiolistview的用法

androidstudiolistview的用法

androidstudiolistview的用法1. 创建ListView控件要使用ListView,首先需要在布局文件中创建一个ListView控件。

在XML文件中,添加以下代码:```xml<ListView/>```2.创建数据源ListView的数据源是一个数组或集合,其中每个元素都对应列表中的一个数据项。

通常情况下,我们会将数据存储在一个数组或集合中。

```javaString[] data = {"Item 1", "Item 2", "Item 3"};```3.创建适配器适配器是ListView的关键组件,它负责将数据源中的数据与列表项的布局进行绑定。

我们可以使用BaseAdapter或ArrayAdapter来创建适配器。

```javaArrayAdapter<String> adapter = new ArrayAdapter<String>(this, yout.simple_list_item_1, data);```4.设置适配器将适配器设置给ListView:```javaListView listView = findViewById(R.id.list);listView.setAdapter(adapter);```5.设置列表项点击事件我们可以为ListView的每个列表项设置点击事件。

只需要为ListView设置OnItemClickListener即可。

```javalistView.setOnItemClickListener(newAdapterView.OnItemClickListenepublic void onItemClick(AdapterView<?> parent, View view,int position, long id)//处理点击事件}});```6.自定义列表项布局如果想要自定义列表项的布局,可以创建一个自定义的布局文件,并在适配器中指定该布局。

Android自定义歌词同步控件

Android自定义歌词同步控件

Android自定义歌词同步控件Android音乐播放器中,播放音乐的类(即MediaPlayer)在播放音乐的时候,通过MediaPlayer 的getCurrentPosition方法可以得到当前音乐播放的流进度,通过getDuration可以得到当前音乐总的流大小。

因此,我们可以通过这两个方法来判断同步的音乐歌词播放进度。

下面,该文档将为大家实现歌词同步,其他音乐播放的东西一概不涉及。

歌词同步相关两个类:SongLyric(歌词对象)歌词对象实例化即可使用,但必须保证该歌词对象验证通过,即歌词文件存在,切正确实例化。

LyricView(Android自定义歌词控件)该歌词控件不可以写在xml配置文件中,必须使用一个layout布局控件存放,使用的时候先从Activity中得到layout,然后再将该歌词控件通过layout的getContext的参数实例化,最后添加到layout中,并且将对应的歌词对象SongLyric设置到歌词控件中。

最后,歌词控件要做到与音乐同步的效果,还得时时刷新歌词控件,这样就有了歌词同步以及滚动的效果。

具体实现方法下面讲到,先看看这两个类源码:SongLyric类,该对象和网上大部分歌词对象一样,这里为了和歌词控件LyricView配套,LyricView控件源码(该类为Android自定义控件,可以看到构造方法只有一个,需得传一个为了大家更了解该歌词控件,下面有一个小小的例子,该例子只是模拟了MediaPlayer播放显示的歌词同步效果,只需要用一个handler不停更新LyricView的setTime方法既可以由歌很简单的例子,唯一不足的就是没有真正用到MediaPlayer这个类,不过后来我在做音乐播放器的时候还是用到了,看看下面的效果(该效果非上面例子的效果,而是我做的播放器主界面效果….虽然不是很好看):。

Android开发自定义TextView省略号样式的方法

Android开发自定义TextView省略号样式的方法

Android开发⾃定义TextView省略号样式的⽅法本⽂实例讲述了Android开发⾃定义TextView省略号样式的⽅法。

分享给⼤家供⼤家参考,具体如下:在布局xml中设置textView的字段android:maxLines="2"android:ellipsize="end"字段之后,textview会⾃动压缩⾏数,并且对压缩掉的部分⽤...显⽰。

如果不想⽤...⽽想⽤。

或者... ...就需要⾃定义这个省略号的样式,不需要⾃定义控件,⽅法如下。

⾸先是布局⽂件<TextViewandroid:id="@+id/textView4"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentTop="true"android:layout_centerHorizontal="true"android:maxLines="2"android:ellipsize="end"android:text="This is a text of TextView This is a text of TextView This is a text of TextView This is a text of TextView This is a text of TextView"android:textSize="20sp" />对textView进⾏代码控制protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);final TextView textView = (TextView)findViewById(R.id.textView4);Layout layout = textView.getLayout();//此时的layout为null,必须⽤观察者模式的回调函数来获取layoutSystem.out.println("layout是"+layout);//此处为nullViewTreeObserver observer = textView.getViewTreeObserver();observer.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {boolean isfirstRunning = true;@Overridepublic void onGlobalLayout() {//此⽅法会被调⽤两次,每执⾏⼀次settext就会执⾏⼀次,第⼀次是显⽰全部的⽂本,不加省略,第⼆次是加上省略,将会删减两次⽂本 // TODO Auto-generated method stubif(isfirstRunning==false)return;//如果不加这⼀⾏的条件,出来之后是完整单词+。

Android中自定义ListView控件实现下拉刷新,简单实用效果好(原创)

Android中自定义ListView控件实现下拉刷新,简单实用效果好(原创)

花了一天时间写出了这个类来实现下拉刷新。

首先这是一个自定义的listView控件类,我在许多项目中都用到了它,效果很稳定。

实现也很简单。

用的时候其他功能都和系统提供的ListView一样,就只是多了一个下拉刷新监听。

用这个类替代系统提供的ListView,下拉刷新再也不会烦恼了。

\(^o^)/~希望对大家有用。

我写的自定义ListView的代码:import java.util.Date;import android.content.Context;import android.util.AttributeSet;import android.util.Log;import youtInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.animation.LinearInterpolator;import android.view.animation.RotateAnimation;import android.widget.AbsListView;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.ListView;import android.widget.AbsListView.OnScrollListener;import android.widget.ProgressBar;import android.widget.TextView;public class MyListView extends ListView implements OnScrollListener {private static final String TAG = "listview";private final static int RELEASE_To_REFRESH = 0;private final static int PULL_To_REFRESH = 1;private final static int REFRESHING = 2;private final static int DONE = 3;private final static int LOADING = 4;// 实际的padding的距离与界面上偏移距离的比例private final static int RATIO = 3;private LayoutInflater inflater;private LinearLayout headView;private TextView tipsTextview;private TextView lastUpdatedTextView;private ImageView arrowImageView;private ProgressBar progressBar;private RotateAnimation animation;private RotateAnimation reverseAnimation;// 用于保证startY的值在一个完整的touch事件中只被记录一次private boolean isRecored;private int headContentWidth;private int headContentHeight;private int startY;private int firstItemIndex;private int state;private boolean isBack;private OnRefreshListener refreshListener;private boolean isRefreshable;public MyListView(Context context) {super(context);init(context);}public MyListView(Context context, AttributeSet attrs) { super(context, attrs);init(context);}private void init(Context context) {setCacheColorHint(context.getResources().getColor(R.color.tran sparent));inflater = LayoutInflater.from(context);headView= (LinearLayout) inflater.inflate(yout.head, null);arrowImageView = (ImageView) headView.findViewById(R.id.head_arrowImageView);arrowImageView.setMinimumWidth(70);arrowImageView.setMinimumHeight(50);progressBar = (ProgressBar) headView.findViewById(R.id.head_progressBar);tipsTextview = (TextView)headView.findViewById(R.id.head_tipsTextView);lastUpdatedTextView = (TextView) headView.findViewById(R.id.head_lastUpdatedTextView);measureView(headView);headContentHeight = headView.getMeasuredHeight();headContentWidth = headView.getMeasuredWidth();headView.setPadding(0, -1 * headContentHeight, 0, 0);headView.invalidate();Log.v("size", "width:" + headContentWidth + " height:"+ headContentHeight);addHeaderView(headView, null, false);setOnScrollListener(this);animation = new RotateAnimation(0, -180,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);animation.setInterpolator(new LinearInterpolator());animation.setDuration(250);animation.setFillAfter(true);reverseAnimation = new RotateAnimation(-180, 0,RotateAnimation.RELATIVE_TO_SELF, 0.5f,RotateAnimation.RELATIVE_TO_SELF, 0.5f);reverseAnimation.setInterpolator(new LinearInterpolator());reverseAnimation.setDuration(200);reverseAnimation.setFillAfter(true);state = DONE;isRefreshable = false;}public void onScroll(AbsListView arg0, int firstVisiableItem, int arg2,int arg3) {firstItemIndex = firstVisiableItem;}public void onScrollStateChanged(AbsListView arg0, int arg1) { }public boolean onTouchEvent(MotionEvent event) {if (isRefreshable) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (firstItemIndex == 0 && !isRecored) {isRecored = true;startY = (int) event.getY();Log.v(TAG, "在down时候记录当前位置‘");}break;case MotionEvent.ACTION_UP:if (state != REFRESHING && state != LOADING) { if (state == DONE) {// 什么都不做}if (state == PULL_To_REFRESH) {state = DONE;changeHeaderViewByState();Log.v(TAG, "由下拉刷新状态,到done状态");}if (state == RELEASE_To_REFRESH) {state = REFRESHING;changeHeaderViewByState();onRefresh();Log.v(TAG, "由松开刷新状态,到done状态");}}isRecored = false;isBack = false;break;case MotionEvent.ACTION_MOVE:int tempY = (int) event.getY();if (!isRecored && firstItemIndex == 0) {Log.v(TAG, "在move时候记录下位置");isRecored = true;startY = tempY;}if(state!= REFRESHING&& isRecored&& state!= LOADING) {// 保证在设置padding的过程中,当前的位置一直是在head,否则如果当列表超出屏幕的话,当在上推的时候,列表会同时进行滚动// 可以松手去刷新了if (state == RELEASE_To_REFRESH) {setSelection(0);// 往上推了,推到了屏幕足够掩盖head的程度,但是还没有推到全部掩盖的地步if(((tempY - startY) / RATIO< headContentHeight)&& (tempY - startY) > 0) {state = PULL_To_REFRESH;changeHeaderViewByState();Log.v(TAG, "由松开刷新状态转变到下拉刷新状态");}// 一下子推到顶了else if (tempY - startY <= 0) {state = DONE;changeHeaderViewByState();Log.v(TAG, "由松开刷新状态转变到done状态");}// 往下拉了,或者还没有上推到屏幕顶部掩盖head的地步else {// 不用进行特别的操作,只用更新paddingTop的值就行了}}// 还没有到达显示松开刷新的时候,DONE或者是PULL_To_REFRESH状态if (state == PULL_To_REFRESH) {setSelection(0);// 下拉到可以进入RELEASE_TO_REFRESH的状态if((tempY - startY) / RATIO>= headContentHeight) {state = RELEASE_To_REFRESH;isBack = true;changeHeaderViewByState();Log.v(TAG, "由done或者下拉刷新状态转变到松开刷新");}// 上推到顶了else if (tempY - startY <= 0) {state = DONE;changeHeaderViewByState();Log.v(TAG, "由DOne或者下拉刷新状态转变到done状态");}}// done状态下if (state == DONE) {if (tempY - startY > 0) {state = PULL_To_REFRESH;changeHeaderViewByState();}}// 更新headView的sizeif (state == PULL_To_REFRESH) {headView.setPadding(0, -1 * headContentHeight+ (tempY - startY) / RATIO, 0, 0);}// 更新headView的paddingTopif (state == RELEASE_To_REFRESH) {headView.setPadding(0, (tempY - startY) / RATIO- headContentHeight, 0, 0);}}break;}}return super.onTouchEvent(event);}// 当状态改变时候,调用该方法,以更新界面private void changeHeaderViewByState() {switch (state) {case RELEASE_To_REFRESH:arrowImageView.setVisibility(View.VISIBLE);progressBar.setVisibility(View.GONE);tipsTextview.setVisibility(View.VISIBLE);lastUpdatedTextView.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.startAnimation(animation);tipsTextview.setText("松开刷新");Log.v(TAG, "当前状态,松开刷新");break;case PULL_To_REFRESH:progressBar.setVisibility(View.GONE);tipsTextview.setVisibility(View.VISIBLE);lastUpdatedTextView.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.setVisibility(View.VISIBLE);// 是由RELEASE_To_REFRESH状态转变来的if (isBack) {isBack = false;arrowImageView.clearAnimation();arrowImageView.startAnimation(reverseAnimation);tipsTextview.setText("下拉刷新");} else {tipsTextview.setText("下拉刷新");}Log.v(TAG, "当前状态,下拉刷新");break;case REFRESHING:headView.setPadding(0, 0, 0, 0);progressBar.setVisibility(View.VISIBLE);arrowImageView.clearAnimation();arrowImageView.setVisibility(View.GONE);tipsTextview.setText("正在刷新...");lastUpdatedTextView.setVisibility(View.VISIBLE);Log.v(TAG, "当前状态,正在刷新...");break;case DONE:headView.setPadding(0, -1 * headContentHeight, 0, 0);progressBar.setVisibility(View.GONE);arrowImageView.clearAnimation();arrowImageView.setImageResource(R.drawable.arrow);tipsTextview.setText("下拉刷新");lastUpdatedTextView.setVisibility(View.VISIBLE);Log.v(TAG, "当前状态,done");break;}}public void setonRefreshListener(OnRefreshListener refreshListener) {this.refreshListener = refreshListener;isRefreshable = true;}public interface OnRefreshListener {public void onRefresh();}public void onRefreshComplete() {state = DONE;lastUpdatedTextView.setText("最近更新:"+ new Date().toLocaleString());changeHeaderViewByState();}private void onRefresh() {if (refreshListener != null) {refreshListener.onRefresh();}}// 此方法直接照搬自网络上的一个下拉刷新的demo,此处是“估计”headView的width以及heightprivate void measureView(View child) {youtParams p = child.getLayoutParams();if (p == null) {p = new youtParams(youtParams.FILL_PARENT,youtParams.WRAP_CONTENT);}int childWidthSpec = ViewGroup.getChildMeasureSpec(0, 0 + 0, p.width);int lpHeight = p.height;int childHeightSpec;if (lpHeight > 0) {childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight,MeasureSpec.EXACTLY);} else {childHeightSpec = MeasureSpec.makeMeasureSpec(0,MeasureSpec.UNSPECIFIED);}child.measure(childWidthSpec, childHeightSpec);}public void setAdapter(BaseAdapter adapter) {lastUpdatedTextView.setText("最近更新:"+ new Date().toLocaleString());super.setAdapter(adapter);}}这个类到此结束了,你可以在项目中建一个类把此类拷贝进去,作为你自定义的listView 使用就可以了。

Android自定义控件:进度条的四种实现方式(ProgressWheel的解析)

Android自定义控件:进度条的四种实现方式(ProgressWheel的解析)

Android⾃定义控件:进度条的四种实现⽅式(ProgressWheel的解析)最近⼀直在学习⾃定义控件,搜了许多⼤⽜们Blog⾥分享的⼩教程,也上GitHub找了⼀些类似的控件进⾏学习。

发现读起来都不太好懂,就想写这么⼀篇东西作为学习笔记吧。

⼀、控件介绍:进度条在App中⾮常常见,例如下载进度、加载图⽚、打开⽂章、打开⽹页等等……都需要这么⼀个效果让⽤户知道我们的App正在读取,以构造良好的交互。

如果没有这样⼀个效果的话,⽤户没法知道东西有没有下载好、图⽚加载了没有、⽂章打开了没……会让⽤户很不爽。

基于这样的情景我们的UI设计师们创造了这样⼀个控件。

⼆、这篇⽂章会涉及的知识点:跟我⼀样刚⼊门的Android菜鸟们,我推荐⼤家先了解⼀下这些知识点再往下看。

这些知识点我也会推荐⼀些博客给⼤家看看,更推荐⼤家看⽂档⾥的解释,当然⼤⽜们可以直接⽆视……1、ClipDrawable类:能够对⼀个drawable类进⾏剪切操作(即只显⽰某⼀部分的区域,另⼀部分隐藏),显⽰多⼤的区域由level控制(level取值是0~10000)【博客:/lonelyroamer/article/details/8244777】、没⽂档的可以在这看【/api/android/ClipDrawable.html】2、⾃定义View:guolin⼤神的深⼊学习View四部曲【 —— /guolin_blog/article/details/12921889】【 —— /guolin_blog/article/details/16330267】【 —— /guolin_blog/article/details/17045157】——/guolin_blog/article/details/17357967】3、没看过我写的:Android⾃定义控件——⽼版优酷三级菜单的话,或许需要看看这个:【RotateAnimation详解——】三、Android上的实现⽅式:(前三种⽅法⽐较简单,第四种⽅法是GitHub项⽬的解析,对前三种没兴趣可以直接跳到后边……)1、效果图:将进度条的变换过程分解为⼀帧⼀帧的图⽚,将这些⼀帧⼀帧的图⽚连起来构成⼀个动画。

Android控件之SeekBar的用法总结

Android控件之SeekBar的用法总结

Android控件之SeekBar的⽤法总结1 SeekBar简介SeekBar是进度条。

我们使⽤进度条时,可以使⽤系统默认的进度条;也可以⾃定义进度条的图⽚和滑块图⽚等。

2 SeekBar⽰例创建⼀个activity,包含2个SeekBar。

第1个SeekBar是系统默认的SeekBar。

第2个SeekBar是⾃定义SeekBar,使⽤⾃定义的背景图和滑块图⽚。

应⽤层代码package com.skywang.control;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.widget.TextView;import android.widget.SeekBar;import android.widget.SeekBar.OnSeekBarChangeListener;public class SeekBarTest extends Activity implements SeekBar.OnSeekBarChangeListener{private static final String TAG = "SKYWANG";// 与“系统默认SeekBar”对应的TextViewprivate TextView mTvDef;// 与“⾃定义SeekBar”对应的TextViewprivate TextView mTvSelf;// “系统默认SeekBar”private SeekBar mSeekBarDef;// “⾃定义SeekBar”private SeekBar mSeekBarSelf;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.seek_bar_test);// 与“系统默认SeekBar”对应的TextViewmTvDef = (TextView) findViewById(_def);// “系统默认SeekBar”mSeekBarDef = (SeekBar) findViewById(R.id.seekbar_def);mSeekBarDef.setOnSeekBarChangeListener(this);// 与“⾃定义SeekBar”对应的TextViewmTvSelf = (TextView) findViewById(_self);// “⾃定义SeekBar”mSeekBarSelf = (SeekBar) findViewById(R.id.seekbar_self);mSeekBarSelf.setOnSeekBarChangeListener(this);}/** SeekBar停⽌滚动的回调函数*/@Overridepublic void onStopTrackingTouch(SeekBar seekBar) {}/** SeekBar开始滚动的回调函数*/@Overridepublic void onStartTrackingTouch(SeekBar seekBar) {}/** SeekBar滚动时的回调函数*/@Overridepublic void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {Log.d(TAG, "seekid:"+seekBar.getId()+", progess"+progress);switch(seekBar.getId()) {case R.id.seekbar_def:{// 设置“与系统默认SeekBar对应的TextView”的值mTvDef.setText(getResources().getString(R.string.text_def)+" : "+String.valueOf(seekBar.getProgress()));break;}case R.id.seekbar_self: {// 设置“与⾃定义SeekBar对应的TextView”的值mTvSelf.setText(getResources().getString(R.string.text_self)+" : "+String.valueOf(seekBar.getProgress()));break;}default:break;}}}代码说明:要监听SeekBar的滑动消息,通过实现“SeekBar.OnSeekBarChangeListener”接⼝。

Android自定义控件实现方向盘效果

Android自定义控件实现方向盘效果

Android⾃定义控件实现⽅向盘效果在很多开发中,为了界⾯更加的友好,在⾃定义View的基础上,开发者会开发出各种各样的⾃定义控件来满⾜实际开发需要,其中有⼀种”⽅向盘”的控件在实际开发中⾮常常见,便于⽤户进⾏⼀些实际性的⽅向控制。

在复习参考了许多⾃定义控件的基础上,我实现了⼀个最最基本的⽅向盘空间,并且可以根据⽅向做出相应的反应。

话不多说,先看看效果。

做的有点丑,⼤家可以看看实际原理,后期再优化具体“⽅向盘”.空间下⾯的⼏⾏字是我为了确定⽅向所写的⼀些参数,基本思想就是在⽅向盘的中⼼确定⼀个坐标轴,根据中间这个⼩圆的和中⼼点的距离与⽅向确定所处的⽅向。

在⼿离开屏幕以后,⼩圆回到原点。

⼀⾔不合就放代码~~~~具体是怎么实现的呢??来我们⼀起看看代码,看完⼀⽬了然。

package com.sshhsun.socketudp.utils;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.util.AttributeSet;import android.util.Log;import android.view.MotionEvent;import android.view.View;public class MyWheel extends View implements Runnable,View.OnTouchListener {public MyWheel(Context context) {super(context);// TODO Auto-generated constructor stub}//先定义⼀些绘图要⽤的基本参数public static final int BOTTOM = 7;public static final int BOTTOM_LEFT = 8;public static final long DEFAULT_LOOP_INTERVAL = 100L;public static final int FRONT = 3;public static final int FRONT_RIGHT = 4;public static final int LEFT = 1;public static final int LEFT_FRONT = 2;public static final int RIGHT = 5;public static final int RIGHT_BOTTOM = 6;private final double RAD = 57.295779500000002D;private Paint button;private int buttonRadius;public double centerX = 0.0D;public double centerY = 0.0D;private Paint horizontalLine;private int joystickRadius;private int lastAngle = 0;private int lastPower = 0;private long loopInterval = 100L;private Paint mainCircle; //整个控件的⼤圆,及⼩红点的活动范围//⾃定义的接⼝⽤于监听处理控件的触摸事件private OnMyWheelMoveListener onmywheelMoveListener;private Paint secondaryCircle;//第⼆个内圆,⼩红圆超过后开始处理⾓度 private Thread thread = new Thread(this);private Paint verticalLine;private int xPosition = 0;private int yPosition = 0;private static final String tag="MyWheel";public MyWheel(Context paramContext, AttributeSet paramAttributeSet) { super(paramContext, paramAttributeSet);initMyWheel(); //好吧,我知道MyWheel这个名字有点太随便了........}public MyWheel(Context paramContext, AttributeSet paramAttributeSet, int paramInt) {super(paramContext, paramAttributeSet, paramInt);initMyWheel();}//根据所处的位置得到⾓度private int getAngle() {if (this.xPosition > this.centerX) {if (this.yPosition < this.centerY) {int m = (int) (90.0D + 57.295779500000002D * Math.atan((this.yPosition - this.centerY)/ (this.xPosition - this.centerX)));stAngle = m;return m;}if (this.yPosition > this.centerY) {int k = 90 + (int) (57.295779500000002D * Math.atan((this.yPosition - this.centerY)/ (this.xPosition - this.centerX)));stAngle = k;return k;}stAngle = 90;return 90;}if (this.xPosition < this.centerX) {if (this.yPosition < this.centerY) {int j = (int) (57.295779500000002D * Math.atan((this.yPosition - this.centerY)/ (this.xPosition - this.centerX)) - 90.0D);stAngle = j;return j;}if (this.yPosition > this.centerY) {int i = -90+ (int) (57.295779500000002D * Math.atan((this.yPosition - this.centerY)/ (this.xPosition - this.centerX)));stAngle = i;return i;}stAngle = -90;return -90;}if (this.yPosition <= this.centerY) {stAngle = 0;return 0;}if (stAngle < 0) {stAngle = -180;return -180;}stAngle = 180;return 180;}//根据红⾊圆的距离和⾓度得到⽅向private int getDirection() {int k;int j = 0;int i;if ((stPower == 0) && (stAngle == 0)) {k = 0;return k;}if (stAngle <= 0)j = 90 + -1 * stAngle;while (true) {k = 1 + (j + 22) / 45;if (k <= 8) {break;}if (stAngle <= 90) {j = 90 - stAngle;continue;}j = 360 - (-90 + stAngle);}return k;}//得到红⾊圆与中⼼的距离private int getPower() {return (stPower=(int) (100.0D * Math.sqrt((this.xPosition - this.centerX) * (this.xPosition - this.centerX)+ (this.yPosition - this.centerY)* (this.yPosition - this.centerY)) / this.joystickRadius));}private int measure(int paramInt) {int i = View.MeasureSpec.getMode(paramInt);int j = View.MeasureSpec.getSize(paramInt);if (i == 0)return 200;return j;}//初始化⼀些基本参数protected void initMyWheel() {this.mainCircle = new Paint(1);this.mainCircle.setColor(Color.BLUE);this.mainCircle.setStrokeWidth(3.0f);this.mainCircle.setStyle(Paint.Style.STROKE);this.secondaryCircle = new Paint();this.secondaryCircle.setColor(-16711936);this.secondaryCircle.setStrokeWidth(3.0f);this.secondaryCircle.setStyle(Paint.Style.STROKE);this.verticalLine = new Paint();this.verticalLine.setStrokeWidth(5.0F);this.verticalLine.setColor(-65536);this.horizontalLine = new Paint();this.horizontalLine.setStrokeWidth(2.0F);this.horizontalLine.setColor(-16777216);this.button = new Paint(1);this.button.setColor(Color.RED);this.button.setStyle(Paint.Style.FILL);}//初始化以后绘制⽅向盘。

android开发 drawable中XML的相关应用,对于控件的自定义很有用处

android开发 drawable中XML的相关应用,对于控件的自定义很有用处
<item android:state_pressed="true">//定义当button 处于pressed 状态时的形态。
<shape>
<gradient android:startColor="#8600ff" />
b. layout布局文件中的XML:<ImageView android:layout_height="wrap_content" android:layout_width="wrap_content" android:src="@drawable/layers" />
ListView.setSelector(drawable);但是这样会出现列表有时候为黑的情况,需要加上:android:cacheColorHint="@android:color/transparent"使其透明。
相关属性:
android:state_selected是选中
android:bottom="10dp" android:right="10dp"/>
</shape>
</item>
<item android:state_focused="true">//定义当button获得 focus时的形态
以下是配置button中的文字效果:
drawable/button_font.xml
<?xml version="1.0" encoding="utf-8"?>

解决Android中自定义DialogFragment解决宽度和高度问题

解决Android中自定义DialogFragment解决宽度和高度问题

解决Android中⾃定义DialogFragment解决宽度和⾼度问题关于详解,⼤家可以参考下。

1、概述DialogFragment在android 3.0时被引⼊。

是⼀种特殊的Fragment,⽤于在Activity的内容之上展⽰⼀个模态的对话框。

典型的⽤于:展⽰警告框,输⼊框,确认框等等。

在DialogFragment产⽣之前,我们创建对话框:⼀般采⽤AlertDialog和Dialog。

注:官⽅不推荐直接使⽤Dialog创建对话框。

2、好处与⽤法使⽤DialogFragment来管理对话框,当旋转屏幕和按下后退键时可以更好的管理其声明周期,它和Fragment有着基本⼀致的声明周期。

且DialogFragment也允许开发者把Dialog作为内嵌的组件进⾏重⽤,类似Fragment(可以在⼤屏幕和⼩屏幕显⽰出不同的效果)。

上⾯会通过例⼦展⽰这些好处~使⽤DialogFragment⾄少需要实现onCreateView或者onCreateDIalog⽅法。

onCreateView即使⽤定义的xml布局⽂件展⽰Dialog。

onCreateDialog即利⽤AlertDialog或者Dialog创建出Dialog。

下⾯通过⽰例代码给⼤家介绍下Android中⾃定义DialogFragment解决宽度和⾼度问题Android中⾃定义DialogFragment解决宽度和⾼度问题但是我们很多时候想把DialogFragment的⾼度固定,那么我们需要设置DialogFragment的⾼度,在Fragment的onResume()声明周期⽅法中设置window的宽⾼即可。

@Overridepublic void onResume() {super.onResume();getDialog().getWindow().setLayout(DeviceUtil.getDeviceWidth(), ResUtils.dp2px(295));}设置DialogFrament 从底部弹出,并且弹出动画为向上滑出,消失动画为向下滑出youtParams params = getDialog().getWindow().getAttributes();params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;params.windowAnimations = R.style.bottomSheet_animation;getDialog().getWindow().setAttributes(params);完整的代码如下:@Nullable@Overridepublic View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {youtParams params = getDialog().getWindow().getAttributes();params.gravity = Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL;params.windowAnimations = R.style.bottomSheet_animation;getDialog().getWindow().setAttributes(params);getDialog().getWindow().requestFeature(Window.FEATURE_NO_TITLE);getDialog().setCanceledOnTouchOutside(true);getDialog().getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));mContentView = inflater.inflate(yout.fragment_create_quick, container, false);return mContentView;}@Overridepublic void onResume() {super.onResume();getDialog().getWindow().setLayout(DeviceUtil.getDeviceWidth(), HlyUtils.dp2px(380));}<style name="bottomSheet_animation" parent="@android:style/Animation"><item name="android:windowEnterAnimation">@anim/slide_in_bottom</item><item name="android:windowExitAnimation">@anim/slide_out_bottom</item></style><?xml version="1.0" encoding="utf-8"?><set xmlns:android="/apk/res/android"android:shareInterpolator="false"><translateandroid:duration="300"android:fromYDelta="100.0%p"android:toYDelta="0.0" /></set><?xml version="1.0" encoding="utf-8"?><set xmlns:android="/apk/res/android"android:shareInterpolator="false"><translateandroid:duration="300"android:fromYDelta="0%p"android:toYDelta="100%p" /></set>总结以上所述是⼩编给⼤家介绍的解决Android中⾃定义DialogFragment解决宽度和⾼度问题,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。

aardio中最重要的控件:自定义控件教程

aardio中最重要的控件:自定义控件教程

aardio中最重要的控件:自定义控件教程
aardio 中最强大的控件是 plus 控件,但最重要的控件是 custom 控件。

不会用 plus 控件可能只是界面没那么好看,而不会用 custom 控件,你在 aardio 中将寸步难行。

在 aardio 新版本中增加了多个 custom 控件的使用范例,范例中包含了详细的使用步骤与要点的说明。

建议大家阅读一下范例,custom 控件用法其实很简洁,范例都没几句代码,一看就能懂。

下面我再补几张图:
一、「界面控件」工具条里最后一个控件就是自定义控件( custom 控件)
二、custom 控件与其他控件的区别是:控件的类名可以修改为任意 win.ui.ctrl 名字空间下的类名。

三、custom 控件的类名还可以指定任何普通创建窗体的代码文件的路径。

上面的文件路径 \res\frmChild1.aardio 从哪里来呢? 其实可以在工程里直接右键点击窗体「复制路径」,如下图:
四、我们还可以调用 custom 控件的 loadForm 函数动态加载一个或多个子窗体。

标准库中的高级选项卡(win.ui.tabs )就是使用custom 控件作为子窗口容器。

五、我们还可以利用custom 控件加载扩展控件,例如浏览器控件。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

今天和大家分享下组合控件的使用。

很多时候android自定义控件并不能满足需求,如何做呢?很多方法,可以自己绘制一个,可以通过继承基础控件来重写某些环节,当然也可以将控件组合成一个新控件,这也是最方便的一个方法。

今天就来介绍下如何使用组合控件,将通过两个实例来介绍。

第一个实现一个带图片和文字的按钮,如图所示:整个过程可以分四步走。

第一步,定义一个layout,实现按钮内部的布局。

代码如下:1.<?xml version="1.0"encoding="utf-8"?>2.<LinearLayout xmlns:android="/apk/res/android"3.android:orientation="horizontal"4.android:layout_width="fill_parent"5.android:layout_height="fill_parent"6.>7.<ImageView8.android:layout_width="wrap_content"9.android:layout_height="wrap_content"10.android:id="@+id/iv"11.android:src="@drawable/confirm"12.android:paddingTop="5dip"13.android:paddingBottom="5dip"14.android:paddingLeft="40dip"15.android:layout_gravity="center_vertical"16./>17.<TextView18.android:layout_width="wrap_content"19.android:layout_height="wrap_content"20.android:text="确定"21.android:textColor="#000000"22.android:id="@+id/tv"23.android:layout_marginLeft="8dip"24.android:layout_gravity="center_vertical"25./>26.</LinearLayout>这个xml实现一个左图右字的布局,接下来写一个类继承LinearLayout,导入刚刚的布局,并且设置需要的方法,从而使的能在代码中控制这个自定义控件内容的显示。

代码如下:1.package com.notice.ib;2.3.import android.content.Context;4.import android.util.AttributeSet;5.import youtInflater;6.import android.widget.ImageView;7.import android.widget.LinearLayout;8.import android.widget.TextView;9.10.public class ImageBt extends LinearLayout {11.12.private ImageView iv;13.private TextView tv;14.15.public ImageBt(Context context) {16.this(context, null);17. }18.19.public ImageBt(Context context, AttributeSet attrs) {20.super(context, attrs);21.// 导入布局22. LayoutInflater.from(context).inflate(yout.custombt, this, true);23. iv = (ImageView) findViewById(R.id.iv);24. tv = (TextView) findViewById();25.26. }27.28./**29. * 设置图片资源30. */31.public void setImageResource(int resId) {32. iv.setImageResource(resId);33. }34.35./**36. * 设置显示的文字37. */38.public void setTextViewText(String text) {39. tv.setText(text);40. }41.42.}第三步,在需要使用这个自定义控件的layout中加入这控件,只需要在xml中加入即可。

方法如下:1.<RelativeLayout2.android:orientation="horizontal"3.android:layout_width="fill_parent"4.android:layout_height="wrap_content"5.android:layout_gravity="bottom"6.>7.<com.notice.ib.ImageBt8.android:id="@+id/bt_confirm"9.android:layout_height="wrap_content"10.android:layout_width="wrap_content"11.android:layout_alignParentBottom="true"12.android:background="@drawable/btbg"13.android:clickable="true"14.android:focusable="true"15./>16.<com.notice.ib.ImageBt17.android:id="@+id/bt_cancel"18.android:layout_toRightOf="@id/bt_confirm"19.android:layout_height="wrap_content"20.android:layout_width="wrap_content"21.android:layout_alignParentBottom="true"22.android:background="@drawable/btbg"23.android:clickable="true"24.android:focusable="true"25./>26.</RelativeLayout>注意的是,控件标签使用完整的类名即可。

为了给按钮一个点击效果,你需要给他一个selector背景,这里就不说了。

最后一步,即在activity中设置该控件的内容。

当然,在xml中也可以设置,但是只能设置一个,当我们需要两次使用这样的控件,并且显示内容不同时就不行了。

在activity中设置也非常简单,我们在ImageBt这个类中已经写好了相应的方法,简单调用即可。

代码如下:1.public class MainActivity extends Activity {2.3.private ImageBt ib1;4.private ImageBt ib2;5.6./** Called when the activity is first created. */7.@Override8.public void onCreate(Bundle savedInstanceState) {9.super.onCreate(savedInstanceState);10. setContentView(yout.login);11.12. ib1 = (ImageBt) findViewById(R.id.bt_confirm);13. ib2 = (ImageBt) findViewById(R.id.bt_cancel);14.15. ib1.setTextViewText("确定");16. ib1.setImageResource(R.drawable.confirm);17. ib2.setTextViewText("取消");18. ib2.setImageResource(R.drawable.cancel);19.20. ib1.setOnClickListener(new OnClickListener() {21.22.@Override23.public void onClick(View v) {24.//在这里可以实现点击事件25. }26. });27.28. }29.}这样,一个带文字和图片的组合按钮控件就完成了。

这样梳理一下,使用还是非常简单的。

组合控件能做的事还非常多,主要是在类似上例中的ImageBt类中写好要使用的方法即可。

再来看一个组合控件,带删除按钮的EidtText。

即在用户输入后,会出现删除按钮,点击即可取消用户输入。

定义方法和上例一样。

首先写一个自定义控件的布局:1.<?xml version="1.0"encoding="utf-8"?>2.<RelativeLayout xmlns:android="/apk/res/android"3.android:layout_width="fill_parent"4.android:layout_height="fill_parent"5.>6.<EditText7.android:id="@+id/et"8.android:layout_width="fill_parent"9.android:layout_height="wrap_content"10.android:singleLine="true"11./>12.<ImageButton13.android:id="@+id/ib"14.android:visibility="gone"15.android:src="@drawable/menu_delete"16.android:layout_width="wrap_content"17.android:layout_height="wrap_content"18.android:background="#00000000"19.android:layout_alignRight="@+id/et"/>20.</RelativeLayout>实现输入框右侧带按钮效果,注意将按钮隐藏。

相关文档
最新文档