Android View 拖动
- 格式:doc
- 大小:188.00 KB
- 文档页数:10
android常用控件大全在Android中使用各种控件(View)DatePicker-日期选择控件TimePicker-时间选择控件ToggleButton-双状态按钮控件EditText-可编辑文本控件ProgressBar-进度条控件SeekBar-可拖动的进度条控件AutoCompleteTextView-支持自动完成功能的可编辑文本控件MultiAutoCompleteTextView-支持自动完成功能的可编辑文本控件,允许输入多值(多值之间会自动地用指定的分隔符分开)ZoomControls-放大/缩小按钮控件Include-整合控件VideoView-视频播放控件WebView-浏览器控件RatingBar-评分控件Tab-选项卡控件Spinner-下拉框控件Chronometer-计时器控件ScrollView-滚动条控件在Android中使用的LayoutFrameLayout:里面只可以有一个控件,并且不能设计这个控件的位置,控件会放到左上角LinearLayout:里面可以放多个控件,但是一行只能放一个控件TableLayout:这个要和TableRow配合使用,很像html里面的tableAbsoluteLayout:里面可以放多个控件,并且可以自己定义控件的x,y的位置RelativeLayout:里面可以放多个控件,不过控件的位置都是相对位置(Android界面布局好像还可以直接引用一些view,如ScrollView等)常用控件:1,EditText主要函数:setText/getText设置/获取文本内容,setHint设置缺省显示内容;2,RadioGroup,RadioButtonRadioButton的isChecked()判断是否被选中获取选中RadioButon的ID:设置RadioGroup.setOnCheckedChangeListener方法publiconCheckedChanged(RadioGroupgroup,intcheckedId)//checkedId 是选中RadioButton的ID3,CheckBoxisChecked()判断是否被选中setOnCheckedChangeListener方法监视选中状态改变情况4,Spinnera,显示数据1),硬编码加载通过setAdapter方法设置类型为ArrayAdapter(Contextcontext,inttextViewResId,String[]objects)textViewResourceId:显示内容的ViewID默认设置为yout.simple_spinner_itemobjects:显示的内容2),从资源文件中加载ArrayAdapter.createFromResource(Contextcontext,inttextArrayResId,in ttextViewResId)//textArrayResId是资源ID返回ArrayAdapter<CharSequence>b,设置下拉列表的风格(可选)adapter.setDropDownViewResource(yout.simple_spinner_d ropdown_item);c,监听选项选择变更事件setOnItemSelectedListener设置监听去Spinner.OnItemSelectedListener类须实现以下两个方法publicvoidonItemSelected(AdapterView<?>parent,Viewview,intposition ,longid)//view选中项实例,position选择项在adapter中的位置publicvoidonNothingSelected(AdapterView<?>arg0)d,设置选中项Spinner.setSelection(position)//索引从0开始d,获取选中项getSelectedItemPosition()getSelectedItem()//该值toString()则为选中内容的字符串getSelectedItemId()getSelectedView()5,AutoCompleteTextView1,setAdapter设置数据adapter2,设置输入多少个字符显示提示AutoCompleteTextView.setThreshold(intthreshold)6,MultiAutoCompleteTextView(允许输入多值,多值之间会自动地用指定的分隔符分开)1,setAdapter设置数据adapter2,setTokenizer设置提示Tokenizer缺省的为maTokenizer()以逗号分隔7,DatePicker,TimePickera,DatePicker1),设置初始显示日期init(intYear,intmonth,intday,newDatePicker.OnDateChangedListener(){ publicvoidonDateChanged(DatePickerview,intyear,intmonthOfYear,intd ayOfMonth){}})2),获取设置值getYeah()/getMonth()/getDayOfMonth()b,TimePicker1),设置setCurrentHour(IntegercurrentHour)/setCurrentMinuter(Integercurrent Hour)2,setIs24HourView(Boolean)设置是否为24小时制显示3,监听设置改变setOnTimeChangedListenerc,获取系统当期时间和日期Calendar.getInstance()返回CalendarCalendar.get(intfield)---field可以为Calendar.YEAR/Calendar.MONTH/Calendar.DAY_OF_MONTH/Calendar. HOUR_OF_DAY/Calendar.MINUTE8,ImageView/ImageButton主要方法setImageResource设置显示图片setAlpha设置Alphainvalidate强制更新setScaleType(ScaleTypest)设置图片显示方式,st是一枚举setAdjustViewBounds设置是否调整控件适应图片大小setBackgroundResource设置背景9,ImageSwitcher(显示一系列的图片,但当前只显示一张图片)显示数据setFactory(ViewSwitcher.ViewFactoryfactory)设置要显示的数据,ViewFactory接口须实现方法publicViewmakeView(){}负责提供当前显示的视图(ImageView),且View必须为新实例方法setImageResource设置当前显示的图片getCurrentView()返回当前显示的视图setInAnimation(Animationani)设置视图装载入时的动画效果,AnimationUtils.loadAnimation(Contextcontext,intid)获取动画效果android.R.anim.XXsetOutAnimation(Animationani)设置视图装载入时的动画效果10,Gallery(显示一系列的图片,提供拖动等特效)显示数据setAdapter(SpinnerAdapteradapter)设置数据适配器.数据适配器可以继承自BaseAdapter,该类publicViewgetView(intposition,ViewconvertView,ViewGroupparent)返回当前选择的视图(ImageView)选项选中监听setOnItemSelectedListener11,GridView(表格显示一系列图片)显示数据setAdapter(ListAdapteradapter)设置数据适配器.数据适配器可以继承自BaseAdapter,该类publicViewgetView(intposition,ViewconvertView,ViewGroupparent)返回当前选择的视图(ImageView)选项选中监听setOnItemSelectedListenergetSelectedView()返回当前选中的视图12,ScrollView13,ProgressBarsetIndeterminate设置进度条是否自动运转setProgressStyle设置显示风格.ProgressDialog.STYLE_HORIZONTAL/ProgressDialog.STYLE_SPINNE RsetProgress设置进度setMax设置最大值getProgress()获取当前进度14,SeekBar方法setMax设置最大值getProgress()获取当前值setProgress设置值setIndeterminate监听器setOnSeekBarChangeListener其下有三个方法publicvoidonProgressChanged(SeekBararg0,intarg1,booleanarg2)//数值变更,arg1新值,是否TouchpublicvoidonStartTrackingTouch(SeekBarseekBar)//开始拖动publicvoidonStopTrackingTouch(SeekBarseekBar)//结束拖动15,ListViewa,显示数据setAdapter(ListAdapteradapter)adapter可为newSimpleCursorAdapter/SimpleAdapter(Contextcontext,intlayout,Curs orc,String[]from,int[]to)layout用来显示数据的模板.显示一列可用yout.simple_list_item_1两列可用yout.simple_list_item_2多列则需要自己实现xml视图布局文件c数据(可用ArrayList构造数据)from':to用来显示对应列的空件idb,动态增删数据adapter.notifyDataSetChanged()d,设置背景色setBackGroudRource。
ViewFlipper的使用2010-08-11 15:31屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面;一个个性化设置页面。
通过查看OPhone API文档可以发现,有个android.widget.ViewAnimator类继承至FrameLayout,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果。
该类有如下几个和动画相关的函数:l setInAnimation:设置View进入屏幕时候使用的动画,该函数有两个版本,一个接受单个参数,类型为android.view.animation.Animation;一个接受两个参数,类型为Context和int,分别为Context对象和定义Animation的resourceID。
∙setOutAnimation: 设置View退出屏幕时候使用的动画,参数setInAnimation函数一样。
∙showNext:调用该函数来显示FrameLayout里面的下一个View。
∙showPrevious:调用该函数来显示FrameLayout里面的上一个View。
一般不直接使用ViewAnimator而是使用它的两个子类ViewFlipper和ViewSwitcher。
ViewFlipper可以用来指定FrameLayout内多个View之间的切换效果,可以一次指定也可以每次切换的时候都指定单独的效果。
该类额外提供了如下几个函数:∙isFlipping:用来判断View切换是否正在进行∙setFilpInterval:设置View之间切换的时间间隔∙startFlipping:使用上面设置的时间间隔来开始切换所有的View,切换会循环进行∙stopFlipping: 停止View切换ViewSwitcher 顾名思义Switcher特指在两个View之间切换。
Android中TextView实现垂直滚动和上下滚动效果布局⾥⾯就是两个⾃定义的TextView,上⾯的左右滑动的是AutoHorizontalScrollTextView;下⾯上下滚动的是AutoVerticalScrollTextView;上⾯左右滑动的⾮常好实现,直接把AutoHorizontalScrollTextView复制到项⽬中,复制全类名到布局⽂件中,和系统TextView⼀样,只需设置⽂本其他什么都不⽤设置;下⾯垂直滚动的AutoVerticalScrollTextView相⽐AutoHorizontalScrollTextView稍微⿇烦⼀点;但是也⾮常简单;如果在项⽬中使⽤的话直接把AutoVerticalScrollTextView复制到项⽬中;有些属性在布局⽂件中没有办法设置,需要在makeView()⽅法中设置:现在这个字体是⽩⾊的,如果不需要去掉//这⾥返回的TextView,就是我们看到的View,可以设置⾃⼰想要的效果public View makeView() {TextView textView = new TextView(mContext);textView.setGravity(Gravity.LEFT);textView.setTextSize(20);textView.setSingleLine(true);textView.setGravity(Gravity.CENTER_VERTICAL);textView.setEllipsize(TextUtils.TruncateAt.END);textView.setTextColor(Color.WHITE);return textView;}接下来看下布局⽂件:<LinearLayout xmlns:android="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><!--左右滚动的textview--><.autotextview.View.AutoHorizontalScrollTextViewandroid:textSize="20sp"android:background="#000000"android:textColor="#ffffff"android:id="@+id/textview"android:layout_width="match_parent"android:layout_height="wrap_content"android:singleLine="true"/><!--上下滚动的TextView--><.autotextview.View.AutoVerticalScrollTextViewandroid:id="@+id/textview_auto_roll"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="#000000"android:padding="5dp"/></LinearLayout>布局⽂件就⾮常简单了,接下来说下两个View具体怎么使⽤:左右滚动的TextView,直接设置⼀个TextView即可;horizontalScrollTV = (AutoHorizontalScrollTextView) findViewById(R.id.textview);horizontalScrollTV.setText(titleStr);⽽垂直滚动的TextView需要的是⼀个数组,当执⾏next()⽅法的时候会执⾏动画切换下⼀个数据;在项⽬中我直接定义了⼀个计时器,每隔2秒发送⼀个消息,然后执⾏AutoVerTicalScrollTextView.next();private String[] strings={"我的剑,就是你的剑!","俺也是从⽯头⾥蹦出来得!","我⽤双⼿成就你的梦想!","⼈在塔在!","犯我德邦者,虽远必诛!","我会让你看看什么叫残忍!","我的⼤⼑早已饥渴难耐了!"}; verticalScrollTV = (AutoVerticalScrollTextView) findViewById(R.id.textview_auto_roll);verticalScrollTV.setText(strings[0]);new Thread(){@Overridepublic void run() {while (isRunning){SystemClock.sleep(3000);handler.sendEmptyMessage(199);}}}.start();private Handler handler = new Handler() {public void handleMessage(Message msg) {if (msg.what == 199) {verticalScrollTV.next();number++;verticalScrollTV.setText(strings[number%strings.length]);}}};点击事件是后期加上去的,在MainActivity的initView()⽅法中添加以下代码:verticalScrollTV.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this,strings[number%strings.length],Toast.LENGTH_SHORT).show();}});以上所述是⼩编给⼤家介绍的Android中TextView实现垂直滚动效和上下滚动效果,希望对⼤家有所帮助,如果⼤家有任何疑问请给我留⾔,⼩编会及时回复⼤家的。
Android 事件处理机制Android 作为一款主流的移动操作系统,拥有强大的事件处理机制,使得开发者可以方便地对用户的操作进行响应和处理。
本文将介绍Android的事件处理机制及其相关的内容。
一、概述Android事件处理机制主要用于检测和响应用户在界面上的各种操作,包括点击、滑动、长按等。
通过灵活运用Android事件处理机制,开发者可以实现丰富多样的用户交互效果,提升应用的用户体验。
二、事件传递1. 事件传递的核心概念- 事件传递分为三个阶段:事件分发、事件拦截、事件处理。
- 事件的传递是从上至下的过程,即从Activity到ViewGroup,再到最终的View。
2. 事件分发- 事件首先会被分发给当前界面的顶层View的dispatchTouchEvent()方法进行处理。
- 顶层View会根据具体的触摸事件类型(DOWN、MOVE、UP、CANCEL)进行相应的处理。
3. 事件拦截- 如果顶层View在处理事件后,认为自己不能完全处理该事件,则会将事件交给子View处理,通过调用子View的dispatchTouchEvent()方法传递事件给子View。
- 子View可以通过重写onInterceptTouchEvent()方法来决定是否拦截事件。
4. 事件处理- 最终,事件会传递到具体的View上,并通过重写onTouchEvent()方法来实现事件的处理。
- View可以根据具体的事件类型(点击、滑动、长按等)执行相应的操作。
三、事件分发机制1. 事件分发的层级关系- Android中的事件分发机制是基于层级关系的,即不同的ViewGroup和View之间存在不同的事件分发机制。
- ViewGroup和View都重写了dispatchTouchEvent()方法,用于对事件进行分发。
2. ViewGroup中的事件分发- ViewGroup会根据具体的事件类型,将事件传递给自己的子View。
androidphotoview用法PhotoView是一个开源项目,用于在Android上实现图片缩放和拖动的功能。
它是ImageView的一个子类,在缩放和拖动方面提供了更多的灵活性和功能。
下面将介绍PhotoView的用法以及一些常见的用例。
首先,要开始使用PhotoView,需要将其添加到您的项目中。
可以通过添加以下依赖项将其添加到您的build.gradle文件中:``````PhotoView的使用方式与普通的ImageView非常相似。
您可以在布局文件中像这样声明PhotoView:```xml```然后,您可以在代码中找到该视图并使用它。
您可以通过findViewById或在Kotlin中使用视图绑定来获取对视图的引用。
```java// 在Java中查找PhotoViewPhotoView photoView = findViewById(R.id.photo_view);// 在Kotlin中使用视图绑定来查找PhotoViewval photoView: PhotoView = findViewById(R.id.photo_view)```接下来,您可以开始使用PhotoView的功能,例如缩放和拖动。
以下是一些常见的用例:1.缩放图片:PhotoView允许用户通过手势缩放图片。
默认情况下,用户可以使用双指捏放手势来缩放图片。
您也可以通过设置setZoomable方法来禁用或启用该功能。
```java// 在Java中禁用缩放功能photoView.setZoomable(false);// 在Kotlin中禁用缩放功能photoView.setZoomable(false)```2.设置加载的图片:您可以通过调用setImageDrawable或setImageResource方法来设置要显示的图片。
这对于在代码中动态更改要显示的图片非常有用。
```java//设置加载的图片photoView.setImageDrawable(getResources(.getDrawable(R.drawa ble.my_image));// 在Kotlin中设置加载的图片photoView.setImageDrawable(getDrawable(R.drawable.my_image)) ```3.添加监听器:您可以为PhotoView添加一个OnMatrixChangedListener监听器来监听图片缩放和拖动的变化。
android taskview的用法
Android TaskView是Android操作系统的一个功能,它允许用户查看和切换最近使用的应用程序和任务。
以下是Android T askView的一些常见用法:
1. 查看最近使用的应用程序:通过长按设备的“多任务”按钮或者滑动屏幕底部的虚拟导航栏,可以打开TaskView。
在TaskView中,你可以看到最近使用的应用程序的缩略图,通过点击缩略图可以打开该应用程序。
2. 切换应用程序:在TaskView中,你可以通过滑动屏幕左右两侧的边缘,或者使用三指水平滑动手势,来切换最近使用的应用程序。
当你滑动到一个应用程序的缩略图时,松开手指即可打开该应用程序。
3. 关闭应用程序:在TaskView中,你可以通过向上滑动应用程序的缩略图,或者使用两指水平滑动手势,来关闭最近使用的应用程序。
当你将一个应用程序的缩略图向上滑动到屏幕顶部时,该应用程序将被关闭。
4. 清理全部任务:在TaskView中,你可以通过点击屏幕底部的“全部清除”按钮,或者使用三指向上滑动手势,来清理全部最近使用的应用程序和任务。
5. 快捷键操作:有一些设备提供了快捷键操作TaskView的功能。
例如,通过同时按下设备的“多任务”按钮和“返回”按钮,可以打开TaskView;通过长按“多任务”按钮,可以直接进行切换应用程序。
需要注意的是,不同的Android设备可能在TaskView的使用方式和功能上略有差异。
以上是一些常见的用法,你可以根据自己的设备和操作系统版本来尝试和使用。
uiautomator2常用方法uiautomator2是一个用于自动化Android设备的框架,它扩展了原生的uiautomator框架,并提供了一系列常用的方法来操作Android设备和应用程序。
下面将介绍一些常用的uiautomator2方法,帮助开发人员快速开发和执行自动化测试脚本。
1. wait(:等待指定的界面元素出现,具有可定制的超时时间。
示例代码:```python```2. text(: 通过文本内容定位界面元素。
示例代码:```pythond(text="").click( #点击文本为“”的界面元素```3. description(: 通过描述内容定位界面元素。
示例代码:```pythond(description="返回").click( #点击描述为“返回”的界面元素```4. resourceId(: 通过资源ID定位界面元素。
示例代码:```python```5. className(: 通过类名定位界面元素。
示例代码:```pythond(className="android.widget.Button").click( #点击类名为“android.widget.Button”的界面元素```6. index(: 通过索引定位界面元素。
示例代码:```pythond(className="android.widget.Button", index=1).click( #点击第二个类名为“android.widget.Button”的界面元素```7. child(: 通过特定关系定位子界面元素。
示例代码:```pythond(className="android.view.View").child(className="android.wi dget.Button").click( #点击父界面元素为“android.view.View”,子界面元素为“android.widget.Button”的界面元素```8. sibling(: 通过特定关系定位兄弟界面元素。
Android⾃定义view制作抽奖转盘本⽂实例为⼤家分享了Android⾃定义view制作抽奖转盘的具体代码,供⼤家参考,具体内容如下效果图TurntableActivitypackage com.bawei.myapplication.turntable;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;import android.view.animation.RotateAnimation;import com.bawei.myapplication.R;import com.bawei.myapplication.turntable.CustomTurntableView;/*** 转盘* @author hasee*/public class TurntableActivity extends AppCompatActivity {CustomTurntableView customTurntableView;boolean isTouchInSide = false;float mDownX, mDownY;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_turntable);initView();}private void initView() {customTurntableView = findViewById(R.id.custom);// findViewById(R.id.custom_inside).setOnClickListener(new View.OnClickListener() {// @Override// public void onClick(View v) {// float degrees = (float)(720 + Math.random() * 1000);// RotateAnimation rotateAnimation = new RotateAnimation(0, -degrees, 450, 450); // rotateAnimation.setDuration(5000);// rotateAnimation.setFillAfter(true);// customCircleView.startAnimation(rotateAnimation);// }// });findViewById(R.id.custom_inside).setOnTouchListener(new View.OnTouchListener() { @Overridepublic boolean onTouch(View v, MotionEvent event) {if (event.getAction() == MotionEvent.ACTION_DOWN &&event.getX() > 200 &&event.getX() < 300 &&event.getY() > 200 &&event.getY() < 300) {isTouchInSide = true;mDownX = event.getX();mDownY = event.getY();return true;}else if(event.getAction() == MotionEvent.ACTION_MOVE && (event.getX() < mDownX -10 ||event.getX() > mDownX + 10 ||event.getY() < mDownY -10 ||event.getY() > mDownY + 10) ){isTouchInSide = false;} else if (event.getAction() == MotionEvent.ACTION_UP &&event.getX() > mDownX -10 &&event.getX() < mDownX + 10 &&event.getY() > mDownY -10 &&event.getY() < mDownY + 10 &&isTouchInSide) {float degrees = (float) (720 + Math.random() * 1000);RotateAnimation rotateAnimation = new RotateAnimation(0, -degrees, 250, 250);rotateAnimation.setDuration(5000);rotateAnimation.setFillAfter(true);customTurntableView.startAnimation(rotateAnimation);}isTouchInSide = false;return false;}});}}对应的布局<?xml version="1.0" encoding="utf-8"?><RelativeLayoutxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:id="@+id/ll"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><com.bawei.myapplication.turntable.CustomTurntableViewandroid:id="@+id/custom"android:layout_width="wrap_content"android:layout_height="500dp"/><com.bawei.myapplication.turntable.CustomTurntableInsideViewandroid:id="@+id/custom_inside"android:layout_width="wrap_content"android:layout_height="500dp"app:text="开始"android:background="#3300ff00" /></RelativeLayout>⾃定义CustomTurntableView继承viewpackage com.bawei.myapplication.turntable;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Path;import android.graphics.RectF;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.View;/*** 这⾥是画转盘的* @author hasee*/public class CustomTurntableView extends View{Paint mPaint;int mCircleCount = 6;float mStartAngle = 0;RectF rectF;public CustomTurntableView(Context context) {super(context);init();}public CustomTurntableView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}private void init(){mPaint = new Paint();mPaint.setColor(Color.BLUE);mPaint.setStrokeWidth(10);mPaint.setTextSize(60);mPaint.setStyle(Paint.Style.FILL);rectF = new RectF();rectF.top = 100;rectF.left = 100;rectF.right = 400;rectF.bottom = 400;}String[] textColor = {"⼀等奖","⼆等奖","三等奖","四等奖","五等奖","六等奖"}; @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);for(int i = 0; i < mCircleCount; i++){//按⾓标单双号设置扇形颜⾊,if(i % 2 == 0 ){mPaint.setColor(Color.BLUE);}else{mPaint.setColor(Color.GREEN);}canvas.drawArc(rectF, mStartAngle, 60, true, mPaint);//设置转盘上的⽂字mPaint.setColor(Color.BLACK);mPaint.setTextSize(20);Path path = new Path();path.addArc(rectF,mStartAngle+20,60);canvas.drawTextOnPath(textColor[i],path,-10,40,mPaint);mStartAngle += 60;}}}⾃定义CustomTurntableInsideView继承viewpackage com.bawei.myapplication.turntable;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.RectF;import android.support.annotation.Nullable;import android.util.AttributeSet;import android.view.View;import com.bawei.myapplication.R;/*** 转盘中间开始按钮和指针* @author hasee*/public class CustomTurntableInsideView extends View {/*** 画笔*/Paint mPaint;RectF mRectF;String mStr;public CustomTurntableInsideView(Context context) {super(context);init();}public CustomTurntableInsideView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);//⾃定义属性,如何添加⾃定义属性如下(考点)//第⼀步:在values⽂件夹下创建attrs.xml//第⼆步:详见attrs.xml⽂件内部//第三步:在所在的布局⽂件的根layout中添加xmlns:app="/apk/res-auto"//第四步:在布局⽂件的控件中添加app:"你在attrs中设置的attr name"="你的值"//第五步:调⽤下⾯这句话,最后的为R.styleable.你在attrs中设置的declare-styleable nameTypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomTurntableView);//第六步:调⽤下⾯这句话,根据你在attrs中设置的format,选择getXXX⽅法,//⼊参为 R.styleable. 加上你在attrs中设置的declare-styleable name 加上 _ 加上你在attrs中设置的attr name mStr = typedArray.getString(R.styleable.CustomTurntableView_text);init();}private void init() {//以下注释请看CustomBingView⾥⾯mPaint = new Paint();mPaint.setColor(Color.RED);mPaint.setStrokeWidth(10);mPaint.setTextSize(20);mPaint.setStyle(Paint.Style.FILL);mRectF = new RectF();mRectF.top = 50;mRectF.bottom = 300;mRectF.right = 300;mRectF.left = 200;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);// setMeasuredDimension(300, 300);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//设置画笔颜⾊为⿊⾊,mPaint.setColor(Color.BLACK);//画出指针,⽤⼀个扇形,然后盖住后⾯补分来简单表⽰canvas.drawArc(mRectF, 60, 60, true, mPaint);mPaint.setColor(Color.RED);//画⼀个红⾊的圆形,就是中间的⼤按钮canvas.drawCircle(250, 250, 50, mPaint);mPaint.setColor(Color.BLACK);//添加按钮上的⽂字canvas.drawText(mStr, 230, 260, mPaint);//画三⾓,第⼀步,创建路径// Path path = new Path();//第⼆步,moveTo第⼀个顶点// path.moveTo(300, 300);//后续相继lineTo其他顶点// path.lineTo(300, 400);// path.lineTo(400, 400);//闭合// path.close();// 画// canvas.drawPath(path, mPaint);}}⾃定义属性attrs.xml<?xml version="1.0" encoding="utf-8"?><resources><!-- name为想要调⽤这个属性的类名即可 --><declare-styleable name="CustomTurntableView"><!-- name为属性的名字,可以随意起,只要符合规则看得懂 --><!-- format为属性内容的类型 --><attr name="text" format="string"></attr></declare-styleable></resources>以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持,关注公众号的更多精彩内容。
Android⽤户界⾯---拖放(DragandDrop)(⼀)⽤Android的拖放框架,能够允许⽤户使⽤图形化的拖放⼿势,把数据从当前布局中的⼀个View对象中移到另⼀个View对象中。
这个框架包括:拖拽事件类、拖拽监听器、以及辅助的⽅法和类。
尽管这个框架主要是为数据移动设计的,但是你能够把它⽤于其他的UI操作。
如,你能够创建⼀个调⾊应⽤程序,⽤户把⼀个颜⾊的图标拖到另⼀个颜⾊图标之上,完成两个颜⾊的调配操作。
概要当⽤户使⽤⼀些被认可的⼿势信号来开始拖动数据时,⼀个拖放操作就开始了。
在响应中,应⽤程序会告诉系统拖动正在启动。
系统就会回调应⽤程序来获得⼀个代表被拖动的数据的图形,当⽤户的⼿指移到这个代表图形(拖动阴影)当前的布局之上时,系统会把拖动事件发给拖动事件监听器对象,并且拖动事件回调⽅法会跟布局中对应View对象进⾏关联。
⼀旦⽤户释放了拖动阴影图形,系统就会结束拖动操作。
从实现View.OnDragListener接⼝的类中创建⼀个拖动事件监听器对象。
⽤View对象的setOnDragListener()⽅法把拖动事件监听器对象设置给⼀个View对象。
每个View对象还有⼀个onDragEvent()回调⽅法。
这两个⽅法会在“拖拽事件监听器和回调⽅法”⼀节中详细介绍。
注意:为了简单起见,⼀下章节⽤“拖拽事件监听器”作为接收拖拽事件的⽰例程序,尽管可实践中也可以使⽤回调⽅法。
在开始拖动的时候,要把要移动的数据和描述这个数据的元数据作为系统调⽤的⼀部分。
拖拽期间,系统把拖拽事件发送给拖拽事件监听器或布局中每个View对象的回调⽅法。
监听器或回调⽅法能够使⽤元数据来判断它们是否能够接受这种数据。
如果⽤户在⼀个View对象之上放下数据,并且这个View对象的监听器或回调⽅法已经告诉系统它要接收这个数据,那么系统就会把数据发送给拖拽事件中的监听器或回调⽅法。
通过调⽤startDrag()⽅法,应⽤程序会告诉系统开始拖拽的动作。
Android View 拖动&插入研究/ 2010年07月01日 07:10 收藏本页View 拖动&插入即:支持拖动图标然后把之插入 2个View 之间为了降低难度选用了若干ImageView 放入ViewGroup : vertical LinearLayout [代码步骤]1. 定义布局:main.xml :Xml代码< ?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"android:id="@+id/linear">< ImageButtonandroid:layout_width="100dip"android:layout_height="100dip"android:src="@drawable/beijing1_b"/>< ImageButtonandroid:layout_width="100dip"android:layout_height="100dip"android:src="@drawable/beijing2_b"/>< ImageButtonandroid:layout_width="100dip"android:layout_height="100dip"android:src="@drawable/beijing3_b"/>< ImageButtonandroid:layout_width="100dip"android:layout_height="100dip"android:src="@drawable/beijing3_b"/>< /LinearLayout>< ?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"android:id="@+id/linear">< ImageButtonandroid:layout_width="100dip"android:layout_height="100dip"android:src="@drawable/beijing1_b"/>< ImageButtonandroid:layout_width="100dip"android:layout_height="100dip"android:src="@drawable/beijing2_b"/>< ImageButtonandroid:layout_width="100dip"接上页android:layout_height="100dip"android:src="@drawable/beijing3_b"/>< ImageButtonandroid:layout_width="100dip"android:layout_height="100dip"android:src="@drawable/beijing3_b"/>< /LinearLayout>2. 变量初始化Java代码lLayout = (LinearLayout)findViewById(R.id.linear);lLayout = (LinearLayout)findViewById(R.id.linear);3. 定义OnTouchListener 用于监听所有动作并注册LinearLayour的所有View 实现为:Java代码touchListener = new OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubint action = event.getAction();int x = (int) event.getRawX();int y = (int) event.getRawY();switch(action){//鼠标按下拖拉动作开始case MotionEvent.ACTION_DOWN:point1 = v.getTop();startX = (int)event.getX();startY = y - v.getTop();break;//鼠标移动拖拉动作进行中case MotionEvent.ACTION_MOVE:yout(x - startX, y - startY, x + v.getWidth() - startX, y - startY + v.getHeight());v.bringToFront();v.postInvalidate();break;//鼠标释放拖拉动作结束case MotionEvent.ACTION_UP:point2 = v.getTop();//计算插入位置位于哪两个相邻View之间int dest = getLocation(v);//remove ori view, and then add view here lLayout.removeView(v);lLayout.addView(v, dest);break;}return false;}};//to listener all ImageViewfor(int i=0;i< p>ImageView iv = (ImageView)lLayout.getChildAt(i);接上页if(iv !=null){iv.setOnTouchListener(touchListener);}else {//error, view is null!}}touchListener = new OnTouchListener(){@Overridepublic boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stubint action = event.getAction();int x = (int) event.getRawX();int y = (int) event.getRawY();switch(action){//鼠标按下拖拉动作开始case MotionEvent.ACTION_DOWN:point1 = v.getTop();startX = (int)event.getX();startY = y - v.getTop();break;//鼠标移动拖拉动作进行中case MotionEvent.ACTION_MOVE:yout(x - startX, y - startY, x + v.getWidth() - startX, y - startY + v.getHeight());v.bringToFront();v.postInvalidate();break;//鼠标释放拖拉动作结束case MotionEvent.ACTION_UP:point2 = v.getTop();//计算插入位置位于哪两个相邻View之间int dest = getLocation(v);//remove ori view, and then add view here lLayout.removeView(v);lLayout.addView(v, dest);break;}return false;}};//to listener all ImageViewfor(int i=0;i< p>ImageView iv = (ImageView)lLayout.getChildAt(i);if(iv !=null){iv.setOnTouchListener(touchListener);}else {//error, view is null!}}4. getLocation(View) 用于:根据目标View 判断待插入的位置即:哪2个相邻ImageView 之间实现为:Java代码public int getLocation(View v){for(int i=0;i< p>接上页ImageView iv = (ImageView)lLayout.getChildAt(i);ImageView iv2 = (ImageView)lLayout.getChildAt(i+1);if(iv.getTop()< v.getTop() && iv2.getTop() > v.getTop()){//refer delta of point1 & point2if(point1 < point2){//drag to bottomreturn i+1;}else {//drag to upreturn i+1;}}}//otherwise return last locationreturn lLayout.getChildCount()-1;}public int getLocation(View v){for(int i=0;i< p>ImageView iv = (ImageView)lLayout.getChildAt(i); ImageView iv2 = (ImageView)lLayout.getChildAt(i+1);if(iv.getTop()< v.getTop() && iv2.getTop() > v.getTop()){ //refer delta of point1 & point2if(point1 < point2){//drag to bottomreturn i+1;}else {//drag to upreturn i+1;}}}//otherwise return last locationreturn lLayout.getChildCount()-1;}5. emulator 运行截图:- 拖拉前:- 拖拉后:。