精华内容
下载资源
问答
  • 1.安卓手势事件简述 就目前而言,安卓手机在使用过程中,人与手机之间的交互都是通过手指进行实现...2.单次点击事件的探究 创建一个项目,页面上有一个button,用于单击。一个textview用于记录事件。 btnAction.set...

    1.安卓手势事件简述

    就目前而言,安卓手机在使用过程中,人与手机之间的交互都是通过手指进行实现的。交互行为最常见的有ACTION_DOWN、ACTION_MOVE、ACTION_UP、ACTION_CANCEL ,ACTION_OUTSIDE以及多点触摸事件等。

    2.单次点击事件的探究

    创建一个项目,页面上有一个button,用于单击。一个textview用于记录事件。

    btnAction.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()){
                        case MotionEvent.ACTION_DOWN:
                            textViewAction.setText("");
                            textViewAction.setText(textViewAction.getText()+"down");
                            break;
                        case MotionEvent.ACTION_MOVE:
                            textViewAction.setText(textViewAction.getText()+"move");
                            break;
                        case MotionEvent.ACTION_UP:
                            textViewAction.setText(textViewAction.getText()+"up");
                            break;
                    }
                    return true;
                }
      btnAction.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    textViewAction.setText(textViewAction.getText()+"click");
                }
            });
    

    当点击button时,textview显示的结果为
    在这里插入图片描述
    由此可见,一次点击事件由 一次down事件,多次move事件和一次up事件构成,move事件出现的次数由用户的按压效果决定。down表示手势事件开始,up表示结束,move则代表着过程。

    当然,此时代码中ontouchlishtener方法中返回的结果为ture,则表示拦截用户的该次行为,由此方法进行处理。而事件不再传递给其他的事件监听器(如clicklistenter)。
    接着我们将返回结果改为false进行探究一下。

    btnAction.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch (event.getAction()){
                        case MotionEvent.ACTION_DOWN:
                            textViewAction.setText("");
                            textViewAction.setText(textViewAction.getText()+"down");
                            break;
                        case MotionEvent.ACTION_MOVE:
                            textViewAction.setText(textViewAction.getText()+"move");
                            break;
                        case MotionEvent.ACTION_UP:
                            textViewAction.setText(textViewAction.getText()+"up");
                            break;
                    }
                    return false;
                }
            });
            btnAction.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    textViewAction.setText(textViewAction.getText()+"click");
                }
            });
    

    此时运行的结果为
    在这里插入图片描述

    3.结论

    **用户的一次点击事件,由一个action_down,多个action_move,和action_up构成。**如果touch事件中,返回了ture,则代表touch事件已处理用户的该次行为,不需要其他事件处理器进行处理,就不再将事件进行传递。如果返回了false,则代表未处理,需要将事件传递出去。

    展开全文
  •  不得不说今天这篇文章本来下午预计吃晚饭之前就能发,结果一个运行时异常活生生耗掉了我三顿晚饭时间,不过最后总能解决,安卓是一个不断遇到问题,解决问题的过程(这个问题既指思路,实现又指异常

             我们已经实现过了listview的一种item的点击事件,开启一个新的活动,并且传递一些数据到新的活动中,现在我们要在新的活动中设置回退按钮。接着我们需要定义实现另一个item的点击事件。

            不得不说今天这篇文章本来下午预计吃晚饭之前就能发的,结果一个运行时异常活生生耗掉了我三顿晚饭的时间,不过最后总能解决,安卓真的是一个不断遇到问题,解决问题的过程(这个问题既指思路,实现又指异常)。遇到的是空指针异常,确定好是哪几个文件之后,最后是一个一个文件的确定好所有的id,变量名,终于运行正常。所以千万注意好所有的id,不要重名,不要不匹配。

           好了回退没啥好上图的,就上点击事件的。

    点击之后:


    先上回退的代码(finish()就可以!)

    ImageView iv =(ImageView)findViewById(R.id.backmain);
    		iv.setOnClickListener(new View.OnClickListener()
            {
            	@Override
            	public void onClick(View v)
            	{
            		finish();
            	}
            });

    那么,现在,我们面临的问题是,如何区分是哪一个点击的item呢?我们就会思考,它们有什么不同,很显然是类型不同,一个是Day类型,一个是Point类型。但是它们都装在object类型的list中,这时候就需要用到我们的instanceof操作符了,然后if-else分开处理即可(当然要为跳转的活动建立活动类,布局文件,注册),还是用intent包裹要传递的数据。

    主活动:

    package com.example.littled;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ImageView;
    import android.widget.ListView;
    import android.widget.AdapterView;
    import android.widget.PopupMenu;
    import android.widget.TextView;
    import android.widget.Toast;
    import android.view.View;
    
    
    public class MainActivity extends Activity {
    	
    	private String monthmenu;
    	private String yearmenu;
    	
    	private ArrayList<Object> daylist = new ArrayList<Object>();
    	private ArrayList<Object> pointlist = new ArrayList<Object>();
    	private ArrayList<Object> data = new ArrayList<Object>();
    	
    	TextView tv1;
    	TextView tv2;
    	
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            tv1=(TextView)findViewById(R.id.text_view1);
            monthmenu = "August";
    		tv1.setText(monthmenu);
            
    		 tv2=(TextView)findViewById(R.id.text_view2);
    		 yearmenu = "2015";
    		 tv2.setText(yearmenu);
    
            tv1.setOnClickListener(new View.OnClickListener()
            {
            	@Override
            	public void onClick(View v)
            	{
            		showPopupMenu1(tv1);
            	}
            });
            
            tv2.setOnClickListener(new View.OnClickListener()
            {
            	@Override
            	public void onClick(View v)
            	{
            		showPopupMenu2(tv2);
            	}
            });
    		
            initDays();
            DayApater adapter = new DayApater(MainActivity.this,data);
            ListView listView = (ListView)findViewById(R.id.list_view);
            listView.setAdapter(adapter);
            
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
            {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id)
                {
                	Object ob = data.get(position);
                	if(ob instanceof Day)
                	{
    	                Day d = (Day)ob;
    	                String sdetail = d.getDetail();
    	                String sday = d.getDay();
    	                String sweek = d.getWeek();
    	                Intent intent = new Intent(MainActivity.this, ShowActivity.class);
    	                intent.putExtra("detail", sdetail);
    	                intent.putExtra("week",sweek);
    	                intent.putExtra("day", sday);
    	                intent.putExtra("year",yearmenu);
    	                intent.putExtra("month", monthmenu);
    	                startActivity(intent);
                	}
                	else if(ob instanceof Point)
                	{
                		Point p = (Point)ob;
    	                String sday = p.getDay();
    	                String sweek = p.getWeek();
    	                Intent intent = new Intent(MainActivity.this, EditActivity.class);
    	                intent.putExtra("week2",sweek);
    	                intent.putExtra("day2", sday);
    	                intent.putExtra("year2",yearmenu);
    	                intent.putExtra("month2", monthmenu);
    	                startActivity(intent);
                	}
                	
                }
            });
        }
            
            private void initDays()
            {
            	Day day1 = new Day("SAT","1","我去超市来着...");
            	data.add(day1);
            	Day day2 = new Day("SUN","2","今天第一次和智恩吃意大利面。");
            	data.add(day2);
            	Day day3 = new Day("MON","3","路两边的树吸走了汽车尾气");
            	data.add(day3);
            	Day day4 = new Day("TUE","4","现在每天都能吃到猪排饭了,好开心啊");
            	data.add(day4);
            	Point point = new Point(R.drawable.blackpoint,"WED","4");
            	//Point point = new Point(R.drawable.blackpoint);
            	data.add(point);
            	Point point2 = new Point(R.drawable.blackpoint,"THR","5");
            	//Point point2 = new Point(R.drawable.blackpoint);
            	data.add(point2);
            	Day day5 = new Day("FRI","7","你,黑咖啡,芝士年糕,羽毛球,成功");
            	data.add(day5);
            	Day day6 = new Day("SAT","8","DGA 7 最爱");
            	data.add(day6);
            }
            private void showPopupMenu1(View view) {
            	 PopupMenu popupMenu = new PopupMenu(this, view);
            	 popupMenu.getMenuInflater().inflate(R.menu.text1, popupMenu.getMenu());
            	 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
            	  @Override
            	  public boolean onMenuItemClick(MenuItem item) {
            		  monthmenu = (String) item.getTitle();
            		  tv1.setText(monthmenu);
            	  return false;
            	  }
            	 });
            	 popupMenu.show();
            }
            private void showPopupMenu2(View view) {
           	 PopupMenu popupMenu = new PopupMenu(this, view);
           	 popupMenu.getMenuInflater().inflate(R.menu.text2, popupMenu.getMenu());
           	 popupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
           	  @Override
           	  public boolean onMenuItemClick(MenuItem item) {
           		  yearmenu = (String) item.getTitle();
           		  tv2.setText(yearmenu);
           	  return false;
           	  }
           	 });
           	 popupMenu.show();
           }
    }
    
    跳转的目的活动:

    package com.example.littled;
    
    import android.app.Activity;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    public class EditActivity extends Activity {
    	@Override
    	protected void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_edit);
    		Intent intent = getIntent();
    		
    		String w = intent.getStringExtra("week2");
    		
    		if(w == "MON")
    			w = "MONDAY";
    		else if(w == "TUE")
    			w = "TUESDAY";
    		else if(w == "WED")
    			w = "WEDNESDAY";
    		else if(w == "THR")
    			w = "THRUTHDAY";
    		else if(w == "FRI")
    			w = "FRIDAY";
    		else if(w == "SAT")
    			w = "SATURDAY";
    		else if(w == "SUN")
    			w = "SUNDAY";
    			
    			
    		TextView tv1 = (TextView)findViewById(R.id.show_week2);
    		tv1.setText(w);
    	
    		String m = intent.getStringExtra("month2");
    		TextView tv2 = (TextView)findViewById(R.id.show_month2);
    		tv2.setText(m);
    		
    		String da = intent.getStringExtra("day2");
    		TextView tv3 = (TextView)findViewById(R.id.show_day2);
    		tv3.setText(da);
    	
    		String y = intent.getStringExtra("year2");		
    		TextView tv4 = (TextView)findViewById(R.id.show_year2);
    		tv4.setText(y);
    		
    		ImageView iv =(ImageView)findViewById(R.id.backmain2);
    		iv.setOnClickListener(new View.OnClickListener()
            {
            	@Override
            	public void onClick(View v)
            	{
            		finish();
            	}
            });
    	}
    }
    

    跳转的目的活动的界面(未完善)

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
        
       <LinearLayout
          		android:layout_marginTop="12dip"
                android:id="@+id/showup2"
                android:layout_width="match_parent"
                android:layout_height="40dip"
                android:orientation="horizontal" >
       
            <View
                android:layout_width="0dp"
                android:layout_weight="2.5"
                android:layout_height="0dp"
                />
        	     
            <TextView 
           	    android:id="@+id/show_week2"
                android:layout_height="20dip"
                android:layout_width="wrap_content"
                android:layout_weight="1"
                android:textStyle="bold"
                />
            
            <ImageView
                    android:layout_height="15dip"
                    android:layout_width="wrap_content"
                    android:layout_weight="1"
                    android:src="@drawable/divi2"
                    />
            
            <TextView 
           	    android:id="@+id/show_month2"
                android:layout_height="20dip"
                android:layout_width="wrap_content"
                android:layout_weight="1"
                android:textStyle="bold"
                />
            <View
                android:layout_width="0dp"
                android:layout_weight="0.5"
                android:layout_height="0dp"
                />
            
            <TextView 
           	    android:id="@+id/show_day2"
                android:layout_height="20dip"
                android:layout_width="wrap_content"
                android:layout_weight="1"
                android:textStyle="bold"
                />
            
            
             <ImageView
                    android:layout_height="15dip"
                    android:layout_width="wrap_content"
                    android:layout_weight="1"
                    android:src="@drawable/divi2"
                    />
             
              <TextView 
           	    android:id="@+id/show_year2"
                android:layout_height="20dip"
                android:layout_width="wrap_content"
                android:layout_weight="1"
                android:textStyle="bold"
                />
            
            <View
                android:layout_width="0dp"
                android:layout_weight="3"
                android:layout_height="0dp"
                />
           
       </LinearLayout>
       
        <ImageView
            android:layout_height="5dip"
           	android:gravity="center"
            android:layout_width="wrap_content"
            android:src="@drawable/longlong"
            />
    
    	
    	<ImageView
    	    android:id="@+id/backmain2"
            android:layout_height="5dip"
            android:layout_marginLeft="150dip"
           	android:gravity="center"
            android:layout_width="wrap_content"
            android:src="@drawable/backgray"
            android:clickable="true"
            />
        
    </LinearLayout>
    

    另外就是,Point是要增加week,day等属性的,因为新的活动需要这些数据,并不是在主界面中不显示就不保有了,当年还是太天真。。。


    展开全文
  • 安卓开发学习之锁屏的实现

    千次阅读 2019-04-18 12:28:40
    5、处理点击事件 经过网上查资料和自己实验,上面问题得以一一解决,下面是过程 实现 广播监听 核心之一是广播监听,用来监听屏幕亮起和home键按下广播。 屏幕亮时启动 屏幕亮起对应actio...

    背景

    趁着今天项目收工,无事可做,记录一下自定义锁屏界面的实现

    思路

    锁屏界面要具备以下特征:

    1、屏幕亮后启动

    2、全屏

    3、屏蔽back和recent键

    4、滑屏解锁

    5、处理点击事件  

    经过网上查资料和自己实验,上面的问题得以一一解决,下面是过程

    实现

    广播监听

    核心之一是广播监听,用来监听屏幕亮起的广播。

    屏幕亮时启动

    屏幕亮起对应的action是SCREEN_ON,这是要做的就是启动锁屏Activity,注意设置标志位ACTIVITY_NEW_TASK,否则会报错从外部启动activity。对应代码如下

    case Intent.ACTION_SCREEN_ON:
    	 Intent startIntent = new Intent(context, LockScreentActivity.class);
    	 startIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK
    				| Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
    	 context.startActivity(startIntent);
    	 break;

     

    后台服务

    后台的服务用来注册广播监听者,之所以不在Activity或者Applicaion里注册广播监听,是因为后台服务很少会被销毁,除非内存实在不够用了。整个类的代码如下

    public class LockScreenService extends Service {
    	LockScreenReceiver mReceiver;
    	@Nullable
    	@Override
    	public IBinder onBind(Intent intent) {
    		return null;
    	}
    
    	@Override
    	public void onCreate() {
    		super.onCreate();
    		IntentFilter intentFilter = new IntentFilter();
    		intentFilter.addAction(Intent.ACTION_SCREEN_ON); // 接收屏幕亮时的广播
    		mReceiver = new LockScreenReceiver();
    		registerReceiver(mReceiver, intentFilter);
    	}
    
    	@Override
    	public void onDestroy() {
    		super.onDestroy();
    		unregisterReceiver(mReceiver);
    	}
    }

    而后在主界面里启动这个服务即可

    锁屏界面

    锁屏界面就是上面的LockScreenActivity,它主要负责全屏、屏蔽recent键和back键以及滑屏解锁等

    全屏

    主要是隐藏导航栏、标题栏透明、取消系统锁屏等,代码如下

    	private void initWindow() {
    		final Window window = getWindow();
    		requestWindowFeature(Window.FEATURE_NO_TITLE); // 无标题
    		window.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD // 取消系统锁屏
    				| WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED); // 锁屏时仍显示
    		window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE // 防止系统栏隐藏时activity大小发生变化
    							| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY // 沉浸式
    							| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION // 隐藏导航栏
    							| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION // 隐藏导航栏
    							| View.SYSTEM_UI_FLAG_FULLSCREEN
    							| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); // 全屏
    		window.setNavigationBarColor(Color.TRANSPARENT);
    		window.setStatusBarColor(Color.TRANSPARENT);
    
    		// 设置标题栏透明
    		if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
    			window.addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    		} else {
    			window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
    			window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
    			window.setStatusBarColor(0);
    		}
    	}
    

    不过有时导航栏和状态栏只是透明,没有隐藏,为了避免内容和状态栏重叠,只好设置一下内容的上间距,使之略大于状态栏的高度,代码如下

    	@Override
    	protected void onCreate(@Nullable Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		...
    
    		mContentView = findViewById(R.id.lock_content);
    		int statusHeight = getStatusBarHeight();
    		Log.i("LockScreen", "onCreate: 状态栏高度:" + statusHeight);
    		RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) mContentView.getLayoutParams();
    		layoutParams.topMargin = statusHeight + 5;
    		mContentView.setLayoutParams(layoutParams);
    		...
    	}
    
    	private int getStatusBarHeight() {
    		int result = 0;
    		int resourceId = getResources().getIdentifier("status_bar_height",
    				"dimen", "android");
    		if (resourceId > 0) {
    			result = getResources().getDimensionPixelSize(resourceId);
    		}
    		return result;
    	}

    屏蔽recent键

    由于按下recent键界面会走到onPause()方法,也就是只是失去焦点但依旧可见,因此只需在onPause()里进行处理即可

    	@Override
    	protected void onPause() {
    		super.onPause();
    		// 屏蔽recent键
    		android.app.ActivityManager activityManager = (android.app.ActivityManager) getApplicationContext()
    				.getSystemService(Context.ACTIVITY_SERVICE);
    		activityManager.moveTaskToFront(getTaskId(), 0);
    	}

    屏蔽back键

    屏蔽back键很简单,覆写onBackPressed()即可

    	@Override
    	public void onBackPressed() {
    		// 屏蔽Back键
    	}

    滑屏解锁

    为了方便处理滑屏解锁和响应点击事件,我用自定义view来作为锁屏界面的视图主体,专门用来处理触摸事件。

    本质是一个ListView,里面处理触摸事件的逻辑如下:

    1、按下事件,记录横坐标

    2、移动事件,根据横坐标和按下时横坐标的差,决定内容的偏移量

    3、抬起事件,根据横坐标,计算滑动了多远,超过阈值则结束锁屏界面;否则内容归位

    因此,相关的代码如下所示

    	@Override
    	public boolean onTouchEvent(MotionEvent ev) {
    		final float x = ev.getX();
    		switch (ev.getAction()) {
    			case MotionEvent.ACTION_DOWN:
    				mStartX = x;
    				break;
    			case MotionEvent.ACTION_MOVE:
    				moveContent(x);
    				break;
    			case MotionEvent.ACTION_UP:
    			case MotionEvent.ACTION_CANCEL:
    				handleTouchResult(x);
    				break;
    		}
    		return super.onTouchEvent(ev);
    	}
    
    	private void moveContent(float x) {
    		float offsetX = x - mStartX;
    		if (offsetX < 0f) {
    			offsetX = 0f;
    		}
    		setTranslationX(offsetX); // 内容的偏移量
    	}
    
    	private void handleTouchResult(float destination) {
    		float offsetX = destination - mStartX;
    		if (offsetX > mWindowWidth * 0.4) { // 超过阈值,结束锁屏activity
    			handleTouchResult(mWindowWidth - this.getLeft(), true);
    		} else { // 否则内容回到原位
    			handleTouchResult(-getLeft(), false);
    		}
    	}
    
    	private void handleTouchResult(float destination, boolean finishActivity) {
    		ObjectAnimator animator = ObjectAnimator.ofFloat(this, "translationX", destination);
    		animator.setDuration(250).start();
    		if (finishActivity) {
    			animator.addListener(new AnimatorListenerAdapter() {
    				@Override
    				public void onAnimationEnd(Animator animation) {
    					super.onAnimationEnd(animation);
    					mActivity.finish();
    				}
    			});
    		}
    	}
    

    为了响应点击事件,我的onTouchEvent返回了父类的返回值,不能拦截。

    阈值是0.4倍的窗口宽度,从锁屏界面传过来,传入时机是锁屏界面所有子view测量完成后,获取decorView的宽度,传入之。LockScreenActivity中相关代码如下:

    	private ViewTreeObserver.OnGlobalLayoutListener mOnGlobalLayoutListener = new ViewTreeObserver
    			.OnGlobalLayoutListener() {
    		@Override
    		public void onGlobalLayout() {
    			mWindowWidth = getWindow().getDecorView().getWidth();
    			mContentView.setmWindowWidth(mWindowWidth);
    			mContentView.setActivity(LockScreentActivity.this);
    			if (mContentView != null) {
    				mContentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
    			}
    		}
    	};
    
    	@Override
    	protected void onCreate(@Nullable Bundle savedInstanceState) {
    		...
    
    		mContentView.getViewTreeObserver().addOnGlobalLayoutListener(mOnGlobalLayoutListener);
    	}

    mContentView就是自定义的listView。

     

    结语

    以上就是这个简单锁屏界面的实现。代码地址:github链接

    参考文献:

    个人第二个项目总结:home键,recent键,back键的屏蔽

    Android锁屏实现与总结

    展开全文
  • 安卓中垂直跑马灯的实现

    千次阅读 2016-10-18 17:50:08
    在我们开发过程中,跑马灯这个功能非常实用,在实现这个功能时候,这个时候我们通常需要找demo来实现这个方法,我从github上面找到这个demo感觉很好用,所以就要实现了这个功能喽MarqueeView,看这个工具类,...

    在我们开发过程中,跑马灯这个功能非常实用的,在实现这个功能的时候,这个时候我们通常需要找demo来实现这个方法,我从github上面找到这个demo感觉很好用,所以就要实现了这个功能喽MarqueeView,看这个工具类,因为我找这个类的时候是没有点击事件的,所以我给它加了一个点击事件,看这个工具类

    public class MarqueeView extends ViewFlipper {
    
        private Context mContext;
        private List<String> notices;
        private boolean isSetAnimDuration = false;
        private int contentSize;
        private int interval = 1000;
        private int animDuration = 500;
        private int textSize = 14;
        private int textColor = 0xffffffff;
        private int gravity = Gravity.LEFT | Gravity.CENTER_VERTICAL;
        //点击事件
        private OnItemClickListener onItemClickListener;
    
        public MarqueeView(Context context, AttributeSet attrs) {
            super(context, attrs);
            init(context, attrs, 0);
        }
    
        private void init(Context context, AttributeSet attrs, int defStyleAttr) {
            this.mContext = context;
            if (notices == null) {
                notices = new ArrayList<>();
            }
    
            TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MarqueeViewStyle, defStyleAttr, 0);
            interval = typedArray.getInteger(R.styleable.MarqueeViewStyle_mvInterval, interval);
            isSetAnimDuration = typedArray.hasValue(R.styleable.MarqueeViewStyle_mvAnimDuration);
            animDuration = typedArray.getInteger(R.styleable.MarqueeViewStyle_mvAnimDuration, animDuration);
            if (typedArray.hasValue(R.styleable.MarqueeViewStyle_mvTextSize)) {
                textSize = (int) typedArray.getDimension(R.styleable.MarqueeViewStyle_mvTextSize, textSize);
                textSize = DisplayUtil.px2sp(mContext, textSize);
            }
            textColor = typedArray.getColor(R.styleable.MarqueeViewStyle_mvTextColor, textColor);
            typedArray.recycle();
    
            setFlipInterval(interval);
    
            Animation animIn = AnimationUtils.loadAnimation(mContext, R.anim.anim_marquee_in);
            if (isSetAnimDuration) animIn.setDuration(animDuration);
            setInAnimation(animIn);
    
            Animation animOut = AnimationUtils.loadAnimation(mContext, R.anim.anim_marquee_out);
            if (isSetAnimDuration) animOut.setDuration(animDuration);
            setOutAnimation(animOut);
        }
    
        // 根据公告字符串启动轮播
        public void startWithText(final String notice) {
            if (TextUtils.isEmpty(notice)) return;
            getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    getViewTreeObserver().removeGlobalOnLayoutListener(this);
                    startWithFixedWidth(notice, getWidth());
                }
            });
        }
    
        // 根据公告字符串列表启动轮播
        public void startWithList(List<String> notices) {
            setNotices(notices);
            start();
        }
    
        // 根据宽度和公告字符串启动轮播
        private void startWithFixedWidth(String notice, int width) {
            int noticeLength = notice.length();
            int dpW = DisplayUtil.px2dip(mContext, width);
            int limit = dpW / textSize;
            if (dpW == 0) {
                throw new RuntimeException("Please set MarqueeView width !");
            }
    
            if (noticeLength <= limit) {
                notices.add(notice);
            } else {
                int size = noticeLength / limit + (noticeLength % limit != 0 ? 1 : 0);
                for (int i = 0; i < size; i++) {
                    int startIndex = i * limit;
                    int endIndex = ((i + 1) * limit >= noticeLength ? noticeLength : (i + 1) * limit);
                    notices.add(notice.substring(startIndex, endIndex));
                }
            }
            start();
        }
    
        // 启动轮播
        public boolean start() {
            if (notices == null || notices.size() == 0) return false;
            removeAllViews();
    
            for (int i = 0; i < notices.size(); i++) {
                final TextView textView = createTextView(notices.get(i), i);
                final int finalI = i;
                textView.setOnClickListener(new OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (onItemClickListener != null) {
                            onItemClickListener.onItemClick(finalI, textView);
                        }
                    }
                });
                addView(textView);
            }
    
            if (notices.size() > 1) {
                startFlipping();
            }
            return true;
        }
    
        // 创建ViewFlipper下的TextView
        private TextView createTextView(String text, int position) {
            TextView tv = new TextView(mContext);
            tv.setGravity(gravity);
            tv.setText(text);
            tv.setTextColor(textColor);
            tv.setTextSize(textSize);
            tv.setTag(position);
            return tv;
        }
    
        public List<String> getNotices() {
            return notices;
        }
    
        public void setNotices(List<String> notices) {
            this.notices = notices;
        }
    
        public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
            this.onItemClickListener = onItemClickListener;
        }
    
        public interface OnItemClickListener {
            void onItemClick(int position, TextView textView);
        }
    
    }
    
    这就是它实现的方式,我从中加了点击事件,所以它的用法是这样的

    <com.redsun.property.views.MarqueeView
        android:id="@+id/vertical_switch_textview1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_toLeftOf="@+id/total_quantity"
        android:layout_toRightOf="@+id/news_image"
        android:background="@color/white"
        android:ellipsize="end"
        android:maxEms="10"
        android:maxLength="10"
        android:textColor="@color/gray_dark"
        android:textSize="@dimen/font_normal"
        app:mvAnimDuration="1000"
        app:mvInterval="3000"
        app:mvTextColor="@color/black"
        app:mvTextSize="14sp"
        tools:text="弘生活APP改版了"
        />
    verticalSwitchTextView1 = (MarqueeView) rootView.findViewById(R.id.vertical_switch_textview1);
    List<String> info = new ArrayList<>();
    info.add("1.能够适应多行长文本的Android TextView的例子");
    info.add("2.\"科比,!");
    info.add("3. GitHub帐号:zhangyuanchong");
    info.add("4.\"理解的也很简单,");
    info.add("5. 破解密钥");
    info.add("6. 实现了两种方式");
    verticalSwitchTextView1.startWithList(info);
    verticalSwitchTextView1.setOnItemClickListener(new MarqueeView.OnItemClickListener() {
        @Override
        public void onItemClick(int position, TextView textView) {
            position = position + 1;
            Toast.makeText(getActivity(), "点击了" + position, Toast.LENGTH_SHORT).show();
        }
    });
    这样就直接实现喽,其实还是蛮简单的呢。

    展开全文
  • 今天在移动端开发的过程中,遇到了一个很常见bug,需求是点击按钮展开菜单内容,再次点击或者点击任意其他内容收进原来样子,在pc,安卓可以正常使用,但是在ios端点击body不生效,在网上也搜集了一些大家解决...
  • 先来看一下效果:由于输入框没有响应事件,所以没法直接在输入的过程中变成星号,因此我这里借助了一个多选框来实现。当多选框点击选中时候,密码会被隐藏,以星号显示,取消多选框勾选时,又会恢复成密码明文。...
  • 说一下在实现这个功能的过程中遇到问题,1:最开始考虑在布局文件中写死两个菜单,利用布局对象visible和gone属性加上animation动画来实现,后来否定了,因为不知道为什么 gone会失效,挡住前面一块,使底部控件点击...
  • 今天在学习安卓的过程中,需要实现一个功能通信,就是需要在一个fragment中设置一个按钮,点击之后会跳转到一个新页面,我首先想到是给按钮设置一个onclick属性, 按照以往写了这样代码 public void toneed...
  • 个人比较常遇见情形是触发listviewitem点击事件时,需要拿到对应数据。当然我们可以通过角标和传入数据对应关系来找到对应数据,但是用使用回调函数方式实现起来思维更加清楚。现在总结一下回调函数...
  • View的事件分发机制

    2016-08-19 11:29:35
    事件分发是安卓中一个很重要的机制,是实现用户交互的必要存在。那么啥是事件呢,事件就是用户与应用UI交互的动作。...那么今天咱们就通过一个简单的点击事件的流程来了解一下View的事件分发是如何实现的。
  • 以列表控件(如:ListView或RecyclerView)实现如图所示界面效果:(后面我给ListView里面加了item的点击事件) 实验过程: 首先我们要在activity-main.xml创建一个ListView,设置id为lstView 代码: <?xml ...
  • 黑马安卓52期视频教程

    热门讨论 2015-06-24 22:15:48
    17_点击事件中View对象作用 day02_Android应用开发-数据存储和界面展现 00_剧情回顾 01_线性布局 02_相对布局 03_帧布局 04_表格布局 05_绝对布局 06_logcat输出 07_在内部存储中写文件 08_在内部存储中读文件 09...
  • 最近开始系统性整理自定义View相关知识,譬如绘制过程源码解析、图形学绘制基础、自定义View多种方式、动画实现等等,脑子真是感觉不够用了,期间又绕到了android点击事件响应这一块,发现之前竟然没有整理...
  • 1.3.1多窗口浏览器模式的实现机制 7 1.3.2跨域交互即缓存处理方法 7 1.3.3页面自适应机制,即设备自适应与浏览器自适应机制 8 1.3.4 “认我测”质检服务平台的设计和实现 8 1.4 本文的结构安排 8 第二章 多窗口类...
  • 以上内容就是对React-Native对Touch事件的实现和用法分析,对于大部分应用来说,使用这四个Touch*组件再配合4个press事件就能对用户的手势进行响应。但是对于比较复杂的交互,还是得使用React-...
  • 前言 关于观察者模式,经常提及,其实我们在...其中最明显例子就是安卓开发中的点击事件。以button为例,当点击动作发生时候,会立即走到点击事件监听onClick方法中。这个现象不难理解,那么他是怎么实现的呢?
  • 小小小小小白记录接口调用学习过程,为了感受一下接口调用通信过程和理解json,纯属练手和学习,仅仅记录学习过程 内容比较基础简单,也...界面,导入OkHttp框架依赖库,写点击事件方法体 需要用到通信方法...
  • 初探匿名内部类

    2017-03-19 13:52:58
    Java有多种内部类,在学习安卓这门课的过程中,最先...例如:对于View的点击事件,当按钮较少或者只有一个按钮时,就不需要在单独创建一个类实现OnClickListener()接口了,可以直接创建OnClickListener()匿名内部类传
  • IOS开发之——让键盘飞

    千次阅读 2014-04-14 18:35:06
    在IOS开发过程中,不像安卓那样有返回键,那么对弹出来键盘怎么才能让它消失呢,要不然好碍事说,特别是输入框下面有个按钮,当我输入时候键盘正好把按钮挡上了,你说纠结不纠结。 现在我们有几种想法消灭...
  • Android 上百实例源码分析以及开源分析 集合打包4

    千次下载 热门讨论 2012-07-10 21:54:03
    MsnEventMgr消息事件的自定义类,含有事件名,地图存储事件等参数信息, MsnSession 消息会话,含有所有参与者的电话号码,以及消息, MsnSessionAdapter 消息会话适配器,显示消息会话视图。 MsnSessionManager ...
  • Android应用开发揭秘--详细书签版

    热门讨论 2012-12-12 13:27:46
    本书实战性强,书中每个知识点都有配精心设计示例,尤为值得一提是,它还以迭代方式重现了各种常用android应用和经典android游戏开发全过程,既可 以以它们为范例进行实战演练,又可以将它们直接应用到...
  • 都会以回调事件的形式,通知给Controller调用者,调用者再具体来处理相关的回调任务,返回给EasyIPCamera,在EasyIPCamera服务的过程当中,如果回调要求需要Controller调用者提供音视频数据帧,Controller调用者可以...
  • auto.js其实就是一款安卓的APP,是国内一个大神一款APP软件,用来实现自动操作手机,帮忙我们做一些重复工作,跟按键精灵、脚本精灵一类软件类似,但是按键精灵和脚本精灵需要手机root才能实现功能,如果你...
  • <div><p>这是很久很久之前想写东西,拖了五六个月,没有动笔,现今补齐,内容有些多,对初学者有用,错误之处,望指出。 理解作用域 理解作用域链是Js编程中一个必须要...
  • 收藏页面:依靠Cookie持久化,实现对文章收藏和展示 项目分类:在WanAndroid上发布项目 网址导航:展示常用开发网站 搜索功能:输入搜索、搜索推荐、历史搜索等等 关于我们:鸿洋wanAndroid介绍 love...
  • 实现了长按超过500毫秒重复执行按下功能。例如长按退格键,不断删除。 shift键切换输入法,esc键隐藏输入法,空格选中第一个汉字,回车选中输入拼音。和搜狗输入法处理一致。 英文、中文、数字字母、大小写...
  • 利用html 手机访问时,点击input控件进行拍照,是使用过程中发现有一部分手机(iphone6 iphone8 iphone11和iphonexr) 拍照是被旋转过了,按照网上办法处理了exif 为6旋转 导致原来可以正常拍照手机照片被旋转...

空空如也

空空如也

1 2
收藏数 28
精华内容 11
关键字:

安卓点击事件的实现过程