之前對源碼的閱讀,總是用時一通亂七八糟的跳轉,以學會使用為目的;過了一段時間,就忘記了,因此打算將一些源碼的閱讀經歷記錄下來,也通過敲一遍的過程,加深理解。
在綏中等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都做網站、成都網站制作、成都外貿網站建設 網站設計制作按需求定制網站,公司網站建設,企業(yè)網站建設,成都品牌網站建設,全網整合營銷推廣,外貿網站制作,綏中網站建設費用合理。
最開始,用一個比較簡單的例子來小試牛刀吧
對于View(Button、TextView等)的點擊事件,常用的寫法是通過 findViewById 獲取View的實例,然后通過 setOnClickListener 設置監(jiān)聽事件,比如我們有如下Button控件。
設置點擊事件(假設在Activity中)
但是還有一種寫法是在xml布局中通過android:onClick屬性直接指定點擊執(zhí)行的函數(shù)。
【思考】
首先我們知道諸如 android:xxx 之類的屬性是會在某個attrs文件中定義的,此處的 android:onClick 是View的屬性,定義在如下文件中。
在View的構造函數(shù)中,會解析出此屬性的值。
看這里, 如果變量handlerName不為空,就會為此View設置點擊事件了 ,這個handlerName就是onClick屬性的值doSubmit,但這個點擊事件,并不是我們所熟悉的OnClickListener。
進一步看看這個 DeclaredOnClickListener 類
DeclaredOnClickListener 實現(xiàn)了 OnClickListener ,其中重點是參數(shù) mResolvedMethod 和 mResolvedContext 。
在onClick事件中最終通過反射 mResolvedMethod.invoke(mResolvedContext, v); 執(zhí)行了doSubmit方法。
doSubmit的訪問權限是否可以設置為private呢?
答案:不可以,因為源碼中沒有調用 mMethod.setAccessible(true); 注入所有修飾符。
其實在onClick屬性的注釋中就已經說明了。
綁定android點擊事件需要在該空間添加android:onClick="click"屬性(click是為事件的方法),具體操作步驟如下:
1、使用Android studio創(chuàng)建一個Android項目,如下圖:
2、打開其XML布局文件,如下圖:
3、添加一個Button并給android:onClick="click"屬性和寬高屬性,如下圖:
4、在綁定了該XML布局的類中實現(xiàn)該方法,這個方法命名必須和click,這個方法就是該控件的點擊事件,如下圖:
按鈕監(jiān)聽的3種方式
使用setOnClickListener (View.OnClickListener l)方法
loginBtn.setOnClickListener(new?View.OnClickListener()?{
@Override
public?void?onClick(View?view)?{
Toast.makeText(ButtonActivity.this,?"點擊了登錄按鈕"?,?Toast.LENGTH_SHORT).show();
}
});
實現(xiàn)接口的方式
public?class?ButtonActivity?extends?Activity?implements?View.OnClickListener?{
private?Button?loginBtn;
@Override
protected?void?onCreate(Bundle?savedInstanceState)?{
super.onCreate(savedInstanceState);
setContentView(R.layout.button_activity);
loginBtn?=?(Button)?findViewById(R.id.login_btn);
}
@Override
public?void?onClick(View?view)?{
switch?(view.getId()){
case?R.id.login_btn:
Toast.makeText(ButtonActivity.this,?"點擊了登錄按鈕"?,?Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
在布局文件中加使用android:onClick屬性
//1、先在布局文件中聲明android:onClick="clickLoginBtn"
Button
android:id="@+id/login_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登錄"
android:onClick="clickLoginBtn"/
//2、然后在代碼總實現(xiàn)該同名方法,注意方法的訪問權限必須為public
public?void?clickLoginBtn(View?view){
Toast.makeText(ButtonActivity.this,?"點擊了登錄按鈕"?,?Toast.LENGTH_SHORT).show();
}
第一種點擊事件
在xml中設置onclick屬性
android:onClick="myOnclick"
第二種;獲取Button然后一個一個單獨綁定點擊事件
"
xmlns:tools=" "
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"?
android:id="@+id/btn_imgBtn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="myOnclick"
android:text="imageButton"
/
android:id="@+id/btn_imgView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:onClick="myOnclick"
android:text="imageView"
/
public class MainActivity extends ActionBarActivity {
private Button btnImageBtn;
private Button btnImageView;
@Override
protected void onCreate(Bundle savedInstanceState) {
? ? super.onCreate(savedInstanceState);
? ? setContentView(R.layout.activity_main);
? ? btnImageBtn = (Button) findViewById(R.id.btn_imgBtn);
? ? btnImageView = ?(Button) findViewById(R.id.btn_imgView);
btnImageBtn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, "點擊ImageButton", Toast.LENGTH_SHORT).show();
}
});
? ? btnImageView.setOnClickListener(new MyListener());
}
第三種:寫一個類(MyListener)實現(xiàn)OnClickListener接口,然后Button在設置onclickListener的時候new一個MyListener
btnImageView.setOnClickListener(new MyListener());
class MyListener implements OnClickListener{
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btn_imgBtn:
Toast.makeText(MainActivity.this, "點擊ImageButton", Toast.LENGTH_SHORT).show();
break;
? ? ?case R.id.btn_imgView:
? ? ? Toast.makeText(MainActivity.this, "點擊imageView", Toast.LENGTH_SHORT).show();
break;
}?
第四種:整個類(MianActivity)實現(xiàn)onclickListener的接口
跳轉界面
Intent:意圖,用于訪問android中的組件
用Intent跳轉界面(activity)
第一步:new一個Intent()
Intent intent1 = new Intent(MainActivity.this,ImageButtonActivity.class);
startActivity(intent1);
public void myOnclick(View view){
?switch (view.getId()) {
case R.id.btn_imgBtn:
Intent intent1 = new Intent(MainActivity.this,ImageButtonActivity.class);
startActivity(intent1);
break;
? ? case R.id.btn_imgView:
? ? ?Intent intent2 = new Intent(MainActivity.this,ImageViewActivity.class);
startActivity(intent2);
break;
Intent intent = new Intent(當前的activity,跳轉到的acticvity.class);
startActivity(intent);
3.ImageView
展示方式:scaleType:
4.ImageButton:
觸摸事件:當控件或者屏幕唄觸摸的時候,產生的反應
public boolean onTouchEvent(MotionEvent event) {
}
imageButton:現(xiàn)在已經唄button代替,用于展示圖片的按鈕。不能顯示文字。
imageView
scaleType:圖片展示的方式
fitStart:展示在控件的上方
fitCenter:展示在控件的中間
fitEnd;展示在控件的下方
fitXY:不按照比例拉伸
matrix:矩陣模式
matrix可以設置圖片旋轉,縮放。移動
獲取圖片的高度和寬度
int h = imgView.getDrawable().getIntrinsicHeight();
int w = imgView.getDrawable().getIntrinsicWidth();
Matrix m = new Matrix();
m.postRotate(45);
m.postRotate(45, w/2, h/2);
imgView.setImageMatrix(m);
移動事件:
按下:MotionEvent.ACTION_DOWN
抬起:MotionEvent.ACTION_UP
移動:MotionEvent.ACTION_MOVE
獲取當前的移動事件,
event.getAction()
"
xmlns:tools=" "
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/img_01"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/ss"
android:scaleType="fitXY"/
android:id="@+id/img_02"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:src="@drawable/gl"
android:visibility="gone"
android:scaleType="fitXY"/
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/bird"
android:layout_gravity="center"
/
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="20sp"
android:textColor="#ff0000"
android:gravity="center"
android:text="小鳥飛"/
public class MainActivity extends Activity {
private ImageView img01;
private ImageView img02;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
img01 = (ImageView) findViewById(R.id.img_01);
img02 = (ImageView) findViewById(R.id.img_02);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//System.out.println("被摸了");
if(event.getAction()==MotionEvent.ACTION_UP){
Log.v("TAG", "被抬起來");
if(img01.getVisibility()==View.VISIBLE){
img01.setVisibility(View.GONE);
img02.setVisibility(View.VISIBLE);
}else{
img01.setVisibility(View.VISIBLE);
img02.setVisibility(View.GONE);
}
}else if(event.getAction()==MotionEvent.ACTION_DOWN){
Log.v("TAG", "被按下了");
}else if(event.getAction()==MotionEvent.ACTION_MOVE){
Log.v("TAG", "移動了");
}
return super.onTouchEvent(event);
}