汪建军的博客

休迅飞凫,飘忽若神,凌波微步,罗袜生尘。

Android developer, sometimes thinking, sometimes try it.


Android开发路上的踩坑锦集(二)

为方便更新(二)是倒序记录的,因为每一条都有数字标注就不用分割线了。


99、httpClient设置UA,在全局的httpClient设置就好了:
defaultHttpClient.getParams().setParameter(HttpMethodParams.USERAGENT, phoneua);

98、paint.setColor(0xFFFA5A16);等于paint.setColor(Color.parseColor("#FFFA5A16"));

97、标准selector举例:

    <!-- 获得焦点但未按下时的背景图片 --> 
    <item android:drawable="@drawable/rect4r1strokegray" android:state_enabled="true" android:state_focused="true" android:state_pressed="false"/> 
    <!-- 按下时的背景图片 --> 
    <item android:drawable="@drawable/rect4rred1strokegray" android:state_enabled="true" android:state_pressed="true"/> 
    <!-- 按下时的背景图片 --> 
    <item android:drawable="@drawable/rect4rred1strokegray" android:state_checked="true" android:state_enabled="true"/> 
    <!-- 默认时的背景图片 --> 
    <item android:drawable="@drawable/rect4r1strokegray"/> 

96、绕中心点无限循环转圈举例:

<set xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@android:anim/linear_interpolator"> 
   <rotate   
    android:fromDegrees="0" 
    android:toDegrees="+360"     
    android:duration="1000"  
    android:repeatCount="-1" 
    android:repeatMode="restart"   
    android:pivotX="50%"    
    android:pivotY="50%"    
    />   
</set>  

95、写了打印看不到,放宽条件又加打印还是看不到,就看看是不是调试的页面错了。

94、为空就不存,这是个错误的逻辑,不能这样想。

93、try-catch-finally,在try里return掉了,finally里的代码也会执行。

92、LayoutInflater的控件一定要view.findViewById,不要犯低级错误。

91、listview到倒数第三项自动加载例子:

 listView.setOnScrollListener(new OnScrollListener() { 
 boolean mLastItemVisible; 
 @Override 
 public void onScrollStateChanged(AbsListView view, int scrollState) { 
 try { 
 if (scrollState == OnScrollListener.SCROLL_STATE_IDLE && mLastItemVisible) { 
 if(!"0".equals(page)) 
 getData(); 
 } 
 } catch (Exception e) { 
 e.printStackTrace(); 
 } 
 } 

 @Override 
 public void onScroll(AbsListView view, int firstVisibleItem, 
 int visibleItemCount, int totalItemCount) { 
 mLastItemVisible = (totalItemCount > 0) && (firstVisibleItem + visibleItemCount >= totalItemCount - 3);//-3就是倒数第三 

 } 
 }); 

90、当service设置android:process=":remote" 在另外的进程,就不能用mAppContext里的东西了

89、改变图标颜色(覆盖原理,例子是将图标颜色设为全白色)

Drawable drawable = this.getActivity().getResources().getDrawable(R.drawable.common_addition);  
drawable.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_IN);  

88、inflate布局出错,检查xml中的selector是否出错,背景图只能

item android:drawable="@color/bg_eeeeee"

不能

item android:color="@color/bg_eeeeee" 

87、ListView点击不全部变黑:android:cacheColorHint="@color/transparent" // 最好透明,不要白色
ListView android:listSelector="@color/transparent" // 去掉点击效果可以这样写

86、Android4.2以后注入js,final类的方法前要加上@JavascriptInterface

85、webview中的网页注入js代码举例:

 webview.addJavascriptInterface(new InJSLocalObj(), "local_getpwd_obj"); 
 final class InJSLocalObj{ 
 public void getpwd(String pwd){ 
 DeLog.i(TAG, "0116--获得密码输入框内的值pwd="+pwd); 
 } 
 } 
 private void getpwd(){ 
   if(webview!=null) 
//  webview.loadUrl("javascript:window.local_getpwd_obj.getpwd('<head>'+" + 
//                         "document.getElementsByTagName('html')[0].innerHTML+'</head>');"); 
 webview.loadUrl("javascript:document.getElementById('p').value='"+12345+"';"); 
 webview.loadUrl("javascript:window.local_getpwd_obj.getpwd(document.getElementById('p').value);"); 
 } 

84、启动activity添加 android:launchMode="singleTask" 的话每次home键切出重进都会启动开屏,可以为开屏广告带来收益

83、wifi下检查是否使用了代理,有效防止接口被抓包:
String proHost = System.getProperty("http.proxyHost"); // 代理ip:192.168.3.79,没有代理就是null String proPort = System.getProperty("http.proxyPort"); // 端口号:8888,没有代理就是-1

82、将图片缩放并且拖到指定位置:

 Matrix matrix = new Matrix(); 
         matrix.setScale(0.6f, 0.6f); 
         matrix.postTranslate(baseB.getWidth()-bgB.getWidth()*0.6f, baseB.getHeight()-bgB.getHeight()*0.6f); 
 canvas.drawBitmap(bgB, matrix, paint); 

81、得到字符串的总长和高:

 Rect bounds = new Rect();  
         paint.getTextBounds(text, 0, text.length(), bounds);  
         Log.i("TAG", "text的总长="+bounds.width()+" ,text的高="+bounds.height()); 

80、给文字加阴影:paint.setShadowLayer(1f, 0f, 1f, Color.RED); radius越大阴影越稀,为0没有阴影,dx,dy为向右向下位移

79、更新包名:1、根包改名 2、全局(右键工程名,要带上res)整字匹配将原包名替换为新包名(hongren替换为bao即可) 3、全局不整字匹配将原app名替换为新app名,措辞修改(如原小宝哥、官方QQ(空间宝:77326206, 红人:77835517)、官方网址、开屏图、4logo、hongren换成bao、各平台key替换xml、爱贝商品) 4、manifest修改 5、清理

78、把一串数字转换为每隔3个数字加“,” 如把12345->12,345

 StringBuffer sb=new StringBuffer(stringNum); 
 int i=sb.length(); 
 while((i=i-3)>0){  
    sb.insert(i, ','); 
 } 
 canvas.drawText(sb.toString()+".00" , 100, 237, paint); 

77、打乱list的顺序达到获得随机顺序的listview:Collections.shuffle(List shuos);

76、无论系统什么字体,强制设置为默认宋体:

Typeface font = Typeface.create(Typeface.SANS_SERIF, Typeface.NORMAL);  
 paint.setTypeface(font);

75、listview里的图片不错位不闪加载一次读缓存不再加载方法:

 List<String> mems = MemoryCacheUtils.findCacheKeysForImageUri(shuo.getPic(),ImageLoader.getInstance().getMemoryCache()); 
 if(mems==null || mems.size()<=0){ // 没缓存不加载图片以确保不闪 
 // File file = DiskCacheUtils.findInCache(shuoed.getPic(), ImageLoader.getInstance().getDiskCache()); 
   // if(!file.exists()){ // 如果加了cacheOnDisk(true)二级缓存存磁盘则还要判断磁盘缓存是否有 
 sh.pic.setImageBitmap(null); // 上一句不管,不要判断二级缓存最完美了 
  // } 
    } 
 // cacheInMemory(true)用缓存,一定要写这句 
 DisplayImageOptions postOption = new DisplayImageOptions.Builder().cacheInMemory(true).cacheOnDisk(true).build(); 
 ImageViewAware iva = new ImageViewAware(sh.pic, true); 
 ImageLoader.getInstance().displayImage(shuo.getPic(), iva, postOption ); 

74、
InputStream inputStream = mActivity.getResources().getAssets().open("zhuangb_qb.png"); bitmap = BitmapFactory.decodeStream(inputStream); 下面73的问题,直接读流不会缩放,bitmap即为真实宽高!!

73、发现把图片放到不同的drawable下,bitmap.getWidth()大小不一样,放到xhdpi下:720*1280的为真实,540*900的为真实的0.75倍,放到drawable下均为乘以屏幕密度大小,canvas.drawText(QBtime, bitmap.getWidth()*185/实际像素宽, bitmap.getWidth()*151/实际像素宽, paint);,连画笔大小都要paint.setTextSize(bitmap.getWidth()*13.0f/实际像素宽);

72、yyyy-MM-dd 月份要大写的M,小写mm是分钟 HH大写就是24小时制 hh为12小时制

71、多加打印是个好习惯,可以发现很多想不到的错误

70、fastjson实体类少字段不会报错,1120验证多一个字段似乎也不报错~

69、

li.name.setText(Html.fromHtml("<font color='#FF3030'>VIP </font>"+rank.getNick()));  
    tv_sign_intro.setText(Html.fromHtml("<font color='#eb5151'><u>"+"文字"+"</u></font>")); // 加下划线变色,加粗是b 

68、listview的item点击效果最靠谱设置:

convertView.setBackgroundResource(R.drawable.zan_item_click); 

67、用context启动Acitivity必须要写intent.setFlags

    Intent intent = new Intent(context, WebActivity.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 

66、ListView 设置属性:
android:fadingEdge="none" // 扁平化 android:headerDividersEnabled="true" // 头部有divider android:listSelector="" // 每项的选择效果 android:listSelector="#00000000" // 无点击效果只能这么设置才有用,@null没用

65、android:windowSoftInputMode="stateAlwaysHidden|adjustResize"
"stateAlwaysHidden" 当该Activity主窗口获取焦点时,软键盘总是被隐藏的,不管是确认导航到该Activity还是Activity被覆盖后显示出来。 "adjustPan" 该Activity主窗口并不调整屏幕的大小以便留出软键盘的空间。相反,当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分。这个通常是不期望比调整大小,因为用户可能关闭软键盘以便获得与被覆盖内容的交互操作。

64、在宽width高height的画布上画一字符串,使字符串水平竖直居中:
水平居中很简单,paint.setTextAlign(Align.CENTER);然后drawText的x坐标设置为width / 2即可,竖直居中稍显麻烦,可以使用FontMetrics对象计算文字高度,然后计算baseline,使文字垂直居中,代码如下:

Paint paint = new Paint();  
paint.setColor(Color.BLUE);  
paint.setTextSize(18);  
paint.setTextAlign(Align.CENTER);  
FontMetrics fontMetrics = paint.getFontMetrics();  
// 计算文字高度  
float fontHeight = fontMetrics.bottom - fontMetrics.top;  
// 计算文字baseline  
float textBaseY = height - (height - fontHeight) / 2 - fontMetrics.bottom;  
canvas.drawText(text, width / 2, textBaseY, paint);  

63、要有这样的好习惯:

 @Override 
 protected void onDestroy() { 
 super.onDestroy(); 
 if(bitmap!=null)bitmap.recycle(); 
 if(newb!=null) newb.recycle();} 

62、不要在线程里操作主线程UI,低级错误,可以在子线程中使用runOnUiThread (Runnable action)将处理抛到主线程

61、单张图片循环平铺作为类壁纸背景:

   <bitmap xmlns:android="http://schemas.android.com/apk/res/android"  
    android:src="@drawable/tiezi_bg_cf" 
    android:tileMode="repeat"/> 

60、不要在非主线程中用toast,非要用需要用handler把它post出来

59、继承后,没给父类赋值,为空易出错

58、String flag = bd.getString("isCollection");变量匹配固定字符串应该这样写:"yes".equals(flag),以防报空

57、Integer比较是否相同也要用equals,用==没用

56、ps圆角矩形工具直接设置四角像素大小,背景透明32*32,矩形28*28,双击图层描边,要描外边!!,1像素d8d8d8,,然后点9工具左上分别在中间点一点,右下划线不包含描边

55、强制隐藏软键盘:

InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);  
imm.hideSoftInputFromWindow(et_syj.getWindowToken(), 0);  

不让edittext获取焦点达到不要一进去就显示软键盘:在其父布局加上: android:focusableInTouchMode="true"

54、

v.setClickable(false);

    v.postDelayed(new Runnable() {//防止多次点击触发多次,导致动画不流畅

    @Override

 public void run() {

 v.setClickable(true);

 }}, 400);

53、惊叹号报错,清理无用看java构建路径

52、ScrollView不设置padding,在他唯一LinearLayout中设置padding,这样滑块就会在最边缘,android:scrollbars="none"直接隐藏滑块

51、只要子布局不设置背景,父布局设置圆角,子布局不会突出,子布局点击效果可以默认为透明,按下才换成带同样圆角的背景

50、用LinearLayout经常要设置android:gravity="center"

49、所有布局中,marginTop -x 和marginLeft -x可与上面或者左边叠加,用于两个矩形加边框后靠拢边框宽度不增加

48、 只能,不能drawable="#ffffff"

47、dimens适配分辨率必须每一项写一个默认的dimens,即不带任何分辨率

46、TextView超出View宽度的字符 省略号显示: android:ellipsize="end" android:singleLine="true"

45、RelativeLayout中一个控件的顶边与另一个控件的顶边对齐时,layout_marginTop不再是距离框架顶边,而是距离相对控件的顶边

44、textview有换行,只能android:layout_height="wrap_content",不能指定高度

43、activity跳转动画:

 @Override

 public void onResume() {

 super.onResume();

 overridePendingTransition(R.anim.left_in,0); // 100% -> 0

 }



 @Override

 public void onPause() {

 super.onPause();

 overridePendingTransition(0,R.anim.right_out); // 0 -> 100%

 }

42、artnum.setText(user.getArtnum()+"");设置int类型要加上+""

41、更新activity展示的数据:

        @Override

 protected void onResume() {

 super.onResume();

 initUserInfo();}

40、AsyncTask弄成class每次使用都new出来!变成
class GetPreUrl extends AsyncTask<Void, Void, Void>{...}和new GetPreUrl().execute();

替代AsyncTask<Void, Void, Void> getPreUrl = new AsyncTask<Void, Void, Void>(){...}和getPreUrl.execute();

39、只想改变布局的一部分属性,不想用java代码重写其他属性,可以先get它的LayoutParams:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) tucao_img.getLayoutParams();

 params.width = width;

 params.height = height;

 tucao_img.setLayoutParams(params);

38、将hsb转换为十六进制,去掉前面两个ff:

 int i = Color.HSVToColor(new float[]{96,0.39f,0.75f});

 String s = Integer.toHexString(i);

 s = s.substring(2, s.length());

37、RelativeLayout中的控件在代码中设置相对位置:params.addRule(RelativeLayout.BELOW, R.id.ck_name);// 在XX下面.....

36、自己写view的单击双击回调事件:

public class TouchImageViewTini extends ImageView { // 这玩意继承一个基础的view

...

// 点击事件

// 弄个接口,回调实现里面的具体方法

 public interface MyTouchGesture{

 public void MyTouchListener(int touchType);

 }



 MyTouchGesture myTouchGesture; // 全局的抽象类



// 公共方法,在使用这个view的时候给全局类赋值,和view.setOnClickListener(new ...具体实现)一个意思

 public void setOnMyTouchGestureListener(MyTouchGesture myTouchGesture){ 

 this.myTouchGesture = myTouchGesture;

 }

...

//重写里面的手势事件,只有手势才能很好区分单击双击

 final TouchGestureDetector.OnTouchGestureListener listener = new 



TouchGestureDetector.OnTouchGestureListener() {



 @Override

 public boolean onSingleTapConfirmed(MotionEvent e) { // 这里单击回调

//  AppManager.getAppManager().finishActivity(ImageZoomDialog.class);

 if(myTouchGesture!=null){

 // 给抽象方法的参数注入值,既给 public void MyTouchListener(int touchType);中的touchType

 myTouchGesture.MyTouchListener(1);

 }

 return performClick();

 }



 @Override

 public void onLongPress(MotionEvent e) {

 performLongClick();

 }



 @Override

 public boolean onDoubleTap(MotionEvent e) {  // 这里双击回调

 if(myTouchGesture!=null){

 myTouchGesture.MyTouchListener(2);

 }

     }

...







}

35、推迟3秒执行:

new Timer().schedule(new TimerTask() {

 @Override

 public void run() { ...} }, 3000);

34、ButterKnife用法:

@InjectView(R.id.user) EditText username;
@OnClick(R.id.submit) void submit() {...}
setContentView(R.layout.simple_activity);  
ButterKnife.inject(this);  

33、给textview赋值的内容一定要加一句toString(),以防报错: textview.setText(comment.getUser().toString());

32、变量、javabean赋值前请初始化,比如SubtitleRequest request = new SubtitleRequest();

31、marginTop和marginBottom上下都要有东西才有效,左右的没有也有效 比如scrollView中的必需用垂直显性布局然后在下面加个1dp长的

textview,

marginBottom才生效!

30、spanner设置按钮样子不要设置spanner的背景(还要将spanner的android:background="@null"),

应该设置适配器中第二个参数(按钮风格布局)的那个textview的背景

ArrayAdapter rightadapter = new ArrayAdapter(context, R.layout.myspinneritemstyle, // Spinner这个按钮的风

context.getResources().getStringArray(R.array.sub_type));

rightadapter.setDropDownViewResource(R.layout.myspinner_dropdown);// 每一格的风格

29、spanner只能用setOnItemSelectedListener,用setOnItemClickListener就报错!!!

28、全局String记得初始化

27、加载raw中的txt数据:ArrayList items = loadItems(R.raw.nyc_sites);

/**

 * @return A list of Strings read from the specified resource

 */

private ArrayList<String> loadItems(int rawResourceId) {

    try {

        ArrayList<String> countries = new ArrayList<String>();

        InputStream inputStream = getResources().openRawResource(rawResourceId);

        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

        String line;

        while ((line = reader.readLine()) != null) {

            countries.add(line);

        }

        reader.close();

        return countries;

    } catch (IOException e) {

        return null;

    }

}

26、布局加上点击效果

            <RelativeLayout

                android:clickable="true"

                android:background="@drawable/find_hd_item" 。。。

25、截屏要判断是否为空才能使用截屏图片

         Bitmap bitmap = view.getDrawingCache();

//          getWindow().getDecorView().setDrawingCacheEnabled(true);

//          Bitmap bitmap = getWindow().getDecorView().getDrawingCache();

         if(bitmap!=null){

            newImg = Blur.fastblur(view.getContext(), bitmap, 24);

            view.setDrawingCacheEnabled(false);

         }

24、两个滑动控件不能嵌套,如ScrollView中不能嵌套ListView

23、RadioButton表示单个圆形单选框,而RadioGroup是可以容纳多个RadioButton的容器,每个RadioGroup中的RadioButton同时只能有一个

被选中

审帖设置一个GONE的RadioButton,平时以及动画过后就他被选中

22、manifest 中 application 中 android:hardwareAccelerated="false" 意思是关闭硬件加速,关闭后各种卡各种BUG

21、设置LinearLayout整体pading应该这样写:android:layout_margin="4dp"

当你在LinearLayout中分别设置 android:layout_marginLeft="52dip"和android:paddingLeft="52dip",android:layout_marginLef是设置整个布局离左边的距离是52像素,而android:paddingLeft是设置布局里面的内容距离左边是52像素

20、比如banner条每项不能填充全宽,每项布局将图片设为背景就可以了

19、xml中浮点数字不用加f,比如1.5f直接写1.5

18、发现同一个控件两个项目风格不一样,肯定是manifest 的 application 的

 android:theme="@style/AppTheme"或者android:theme="@android:style/Theme.NoTitleBar"

17、设置控件向左旋转45度:satelliteMenu.setRotation(-45f);

16、引用自定义需要命名空间加上xmlns:sat="http://schemas.android.com/android.view.ext"

15、得到屏幕宽:

    DisplayMetrics dm = new DisplayMetrics();

    getWindowManager().getDefaultDisplay().getMetrics(dm);

    int screenW = dm.widthPixels;

14、 Handler handler= new Handler();

... ... 在onStart() ... ...

//利用handler.postDelayed(r,1000),在队列中要求延迟1秒后进行r的处理,而在r的处理中, 最后在handler的队列中加 入一个要求延迟1秒的处理,如是,就可以实现每隔1秒的定期处理。

    handler.postDelayed(new Runnable(){

        public void run() {

            if(isRunning && Chapter15Test2.step < 20){

                step ++;

                bar.incrementProgressBy(5);

                handler.postDelayed(this, 1000);

            }

        }        

    },1000);

13、导入别人的包完了右键属性选择Android版本、编码utf-8

12、LinearLayout设置子布局距离底部30dp:

            android:layout_gravity="bottom"

     android:layout_marginBottom="30dp" 

RelativeLayout设置子布局居中距离底部30dp:

    android:layout_centerHorizontal="true"

    android:layout_alignParentBottom="true"

    android:layout_marginBottom="30dp" 

11、自定义alertdialog:

     AlertDialog dlg = new AlertDialog.Builder(mActivity).create();

      dlg.setCanceledOnTouchOutside(false);

      dlg.show();

      Window dialogView = dlg.getWindow();

      dialogView.setContentView(R.layout.text_box);

     ((TextView) dialogView.findViewById(R.id.textView1)).setText("You win!");

     ((TextView) dialogView.findViewById(R.id.textView2)).setText("恭喜过关,是否分享给小伙伴?");

     ((ImageButton) dialogView.findViewById(R.id.button1)).setOnClickListener(new View.OnClickListener() {

 @Override

 public void onClick(View v) {

 Share.shareGame(mView, Share.SHARE_WIN,"SinaWeibo");

 }

 });

10、其实每个平台需要的是Android签名的MD5值(全部无冒号紧凑小写)

9、 AlertDialog的建立报错:android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

导致报这个错是在于new AlertDialog.Builder(mcontext),虽然这里的参数是AlertDialog.Builder(Context context)但我们不能使用getApplicationContext()获得的Context,而必须使用Activity,因为只有一个Activity才能添加一个窗体。

解决方法:将new AlertDialog.Builder(Context context)中的参数用Activity.this(Activity是你的Activity的名称)来填充就可以正确的创建一个Dialog了。

8、如果某些操作卡,加上这个(卡的语句放在异步并且过后0.5秒执行,截图保存再分享该图,分享语句可以过后0.5秒执行就不报空了):

             try {

 Thread.sleep(500);

 } catch (InterruptedException e) {

 e.printStackTrace();

 }

             new Thread(){

             @Override

             public void run() {

             super.run();

             Share.shareGame(MainView.this, Share.SHARE_WIN); //卡的语句

             }

             }.start();

7、判断String和int相同必须在int上加引号:String.equals("int");

6、解决GridView错位:去掉if(convertView == null){}else{myImageView = (ImageView)convertView;}这几句

5、android string.xml前后加空格:  换行还是加\n

4、控件自定义属性举例

        TypedArray a = context.obtainStyledAttributes(attrs,  R.styleable.MyView);  



        int textColor = a.getColor(R.styleable.MyView_textColor,  

                0XFFFFFFFF); 

3、View.setTag()与View.getTag()的作用

这个东西在一些需要用到Adapter自定控件显示方式的时候非常有用

Adapter 有个getView方法,可以使用setTag把查找的view缓存起来方便多次重用

    ...

  convertView.setTag(vh);

        } else {

                vh = (ViewHolder) convertView.getTag();

        }

//其他的代码可以直接使用 vh.view1、vh.view2、vh.view3 、vh.view4}

View中的setTag(Onbect)表示给View添加一个格外的数据,以后可以用getTag()将这个数据取出来。

可以用在多个Button添加一个监听器,每个Button都设置不同的setTag。这个监听器就通过getTag来分辨是哪个Button 被按下。

2、attrs.xml文件中属性类型format值的格式

1

"reference" //引用

2

"color" //颜色

3

"boolean" //布尔值

4

"dimension" //尺寸值

5

"float" //浮点值

6

"integer" //整型值

7

"string" //字符串

8

"fraction" //百分数,比如200%

枚举型的格式:

1

2

3

4

XML文件中使用:

1

android:orientation = "vertical"

标志位、位或运算,格式如下:

view sourceprint?

01

02

03

04

05

06

07

08

09

10

11

12

XML文件中使用:

1

android:windowSoftInputMode = "stateUnspecified | stateUnchanged | stateHidden">

属性定义可以指定多种类型:

1

XML文件中使用:

1

android:background = "@drawable/图片ID|#00FF00"

1、点击和滑动不冲突解决方案(控件setOnTouchListener会导致setOnClickListener无效):

  • 关键点:

  • (1)、event.getRawX()是相当于屏幕左上角的横向移动,而不是相当于控件(这个是event.getX())向左滑动为负。

  • (2)、startRawX这些必须是全局的,不能是setOnTouchListener内部的,因为每次滑动都是一个新的setOnTouchListener

    float startRawX=0,startRawY=0; 
    
    
    tv.setOnTouchListener(new View.OnTouchListener() {
    
    
    
    @Override
    
    
    public boolean onTouch(View v, MotionEvent event) {
    
    
        switch (event.getAction()) {
    
    
            case MotionEvent.ACTION_DOWN:
    
    
                startRawX = event.getRawX();
    
    
                startRawY = event.getRawY();
    
    
                break;
    
    
            case MotionEvent.ACTION_UP:
    
    
                if(Math.abs(event.getRawX()-startRawX)&gt;3 || Math.abs(event.getRawY()-startRawY)&gt;3){
    
    
                    // 触摸处理
    
    
                } else {
    
    
                    // 点击处理
    
    
                }
    
    
                break;
    
    
        }
    
    
        return true;
    
    
    }
    
    });
最近的文章

Android开发路上的踩坑锦集(三)

(三)会有一些想问题的方法。 1、给Listview设置高度:android:minHeight="50dp" 2、android studio的assets包是在main下面和“java”包同一层的…

Android笔记继续阅读
更早的文章

Android开发路上的踩坑锦集(一)

  学习Android有3年了,从事Android开发也有两年多了,从一个小菜鸟到目前也成长了许多,期间踩过茫茫多的坑,大多数我都会记录下来。之前是用txt记录的,我尽量按照Mar…

Android笔记继续阅读
comments powered by Disqus