hsv wheel color picker

via http://chiralcode.com/color-picker-for-android/

Single color picker

Color Picker is based on HSV color model. Using color wheel in the middle, user can adjust hue and saturation. Arc on the right side allows user to change value of the selected color. Arc on the left side shows currently selected color. This is how it looks like:

Android Color Picker Android Color Picker Android Color Picker

Multi color picker

More advanced version allows to pick several colors at once. It is really not easy to compose a palette of eye-catching colors. Changing only the hue while keeping saturation and color value on the same level gives nice effects and is easy to achieve.

Android Color Picker Android Color Picker Android Color Picker

Project is available at GitHub: https://github.com/chiralcode/Android-Color-Picker/

 

UberColorPicker Demo

UberColorPicker Demo - screenshot thumbnail UberColorPicker Demo - screenshot thumbnail

Superdry Color Picker

Superdry Color Picker Demo - screenshotSuperdry Color Picker Demo - screenshot

https://github.com/superdry/

Android touch

try to use itemized overlay to draw image and to draw at certain point override the OntouchEvent Method and pass it the lat and long and you will get Image on the touched location if you need some example u can see here

The Android standard View class support touch events. You can react touch events in your custom views and your activities. Android supports multiple pointers, e.g. fingers which are interacting with the screen.

Android touch

The base class for touch support is the MotionEvent class which is passed to Views via the onTouchEvent() method. To react to touch events you override the onTouchEvent() method. The MotionEvent class contains the touch related information.e.g. the number of pointers, the X/Y coordinates and size and pressure of each pointer.

This method returns true if the touch event has been handled by the view. Android tries to find the deepest view which returns true to handles the touch event. If the view is part of another view (parent view), the parent can claim the event by returning true from the onInterceptTouchEvent() method. This would send an MotionEvent.ACTION_CANCEL event to the view which received previously the touch events.

To react to touch events in an activity, register an OnTouchListener for the relevant Views.

1. Five colour brushes.
2. Three types of drawing pencils.
3. Beautiful colours are given to draw a nice painting.

You can use different shapes like: circle, square, rectangle, cubes,triangles, lines, arrow, stars etc… Press on color icon to set the background color.

To color an image on user’s tap, to fill a given image with some color

– Implement and supply the source code for a fast flood fill algorithm for the Android platform that can instantly fill a region bounded by one specified colour with the desired colour
– Ensure that the code functions on both phone and tablet Android devices with various screen sizes
– Write clean, modular, robust code to implement the desired requirements
– Provide a test harness and source to verify the performance of the code on the target platform

nexus 4 root

超级用户的权限,也就是在程序列表里有Superuser,但你并未取得超级授权,也就是Supersu,所以有些软件还是用不成,Supersu比superuser权限还要高。可以说安装了Supersu才是真正彻底的root了。

Nexus 4获取root需要先刷入第三方recovery. 因此获取root需要分两个步骤进行,刷入recovery以及获取root

解锁。解锁后才能刷recovery-root-刷rom 等。

刚买的nexus 4都是没有解锁的,除非卖家帮你解过了(这里的解锁是指手机底层bootloader),附上检查有无解锁的方法:
如果你开机第一屏的白字Google下面没有一把白色解开的锁,那么证明你的机子没有解锁。或者如果你手机进入fastboot模式后下面有段英文【LOCK STATE】那行后面显示的是【LOCKED】,也证明你的机子没有解锁。

警告:解锁会清空手机里面所有数据,包括SD卡数据(不会清除电话卡),所以请事先备份。

1、手机在关机状态下,同时按住【音量下】+【电源键】4~5秒左右,看到start字样便进入了fastboot模式;

2、将手机连接至电脑;

3、将下载的ROOT包解压至任意位置,并运行其中的【一键解锁.bat】;

NEXUS4 ROOT 一键解锁

 

刷入Recovery

4、输入【1】后按回车确认,看了3条提示后按任意键开始解锁;

5、解锁完手机后,手机依旧停留在bootloader界面,此时请用【音量键】选择【start】,然后【电源键】确定,即可重启手机,顺便验证下解锁是否成功。

NEXUS4 ROOT 解锁成功

NEXUS4 刷Recovery

1、重启完成进入系统后请再次打开【USB调试】;

2、进入fastboot模式:将手机关机,同时按住【音量-】+【电源键】4~5秒左右,看到start字样即可;

3、运行【一键刷入recovery.bat】;

4、确认连接正常后,按任意键开始刷入Recovery;

5、完成后,手机会进入recovery(显示ClockworkWod Recovery v6.0.2.3),说明recovery刷入成功;

超简单 LG Nexus 4 E960 ROOT权限和刷recovery教程

6、选择【-wipe data/factory reset】——-选【yes】确定
选择【-wipe cache partition】———–选【yes】确定
(双wipe即擦除数据,有人反应刷完recovery如果不wipe直接重启会卡屏,所以这里我们统一WIPE下)

7、选择【-reboot system now】,此时会出现选项:
-no ——如果选择这个重启后原生recovery会复活,刚刚刷的第三方recovery将被灭掉
-disable recovery flash ——如果选择这个那么刚刚刷的第三方recovery会被固定
当然,我们需要选择2(没有上述1、2选项的请无视之)

重启完毕后,我们完成第三方recovery的刷入。

NEXUS4一键ROOT

1、重启后请继续打开【USB调试】;

2、运行【一键Root【全自动】.bat】;

NEXUS4 ROOT 运行工具

3、满足条件后按任意键开始;

4、ROOT权限获取期间,手机将重启2次,全程请不要断开连接,以防出现不可预料的情况。

结束后,会在应用列表中看到多了一个SuperSU和RE管理器,此时打开RE管理器若有弹出授权请求,那便证明你的NEXUS4 4.2.2 ROOT权限获取成功。

下图的那个小飞人图标就是SuperSU,管理ROOT权限的,每个要求 ROOT 权限的程序,都要通过它的许可才能获得 ROOT 级别的权限。
2013年05月01日 - zy - 吴志勇在网易

via LG Nexus4一键ROOT、解锁及刷Recovery详细图文教程

2013年05月01日 - zy - 吴志勇在网易
然后下载 Nexus Root Toolkit v1.6.3,用腾讯手机管家备份了程序和电话号码,那时候手机管家还能连接上  Nexus 4 。之后安装 Nexus Root Toolkit ,打开 Nexus 4 的“USB调试”模式,手机连上PC,又用 Nexus Root Toolkit 备份了程序和用户数据。

第一步:进入bootloader ——大家可以直接关机——按住音量上和下——同时按住电源,进入Bootloader模式

手机关机状态下,按住音量下+开机键  5秒左右,就会自动进入fastboot mode(快速启动模式)

  • start,手机正常开机
  • restart bootloader,则为解锁的功能,下图是手机上锁状态(如果是上锁状态,按开机键则无任何反应,手机闪一下,然后还是restart bootloader模式)
  • recovery mode,点击后出现绿色机器人+无命令   (卡在绿色机器人+无命令 ,长按开机键10秒关机后,重新开机即可)
  • power off关机

GalaxyNexus-Fastboot_Bootloader_Mode

进入Recovery并且清空数据
按几次音量下,找到Recovery mode,然后点击电源键进入。进入后,你会看到一个倒地的机器人,什么事情都干不了….

然后按住电源不放,短按一下音量上,就进入官方Recovery mode,选择Wipe factory之类的,都选一遍

 


第二步:下载Recovery
下载地址:  



在bootloader模式下,双击Nexus 4 Recovery.bat,屏幕的窗口消失就意味着刷成功了。

3、刷入Root
在刷入Recovery后,你的界面仍然在Bootloader下面,按多几次音量下,找到Recovery Mode,进去。
然后:
第一步:Install Zip
第二步:Choose Zip From SDCARD
第三步:找到你存放的root.zip,选中它
第四步:选择yes,刷入
第五步:最后再重启,在重启菜单千万不要选disable recovery flash,选NO,否则root失败

然后就有root了。

PS:如果遇到waiting usb这类的问题,一般有两种情况:
1、你的手机没装过类似于豌豆荚,手机管家PC版之类的软件的  ——重下adb支持或者recovery,我在原来的包里面补了一个usb连接的支持
2、如果是7.25日23.30分(也就是我已经补了连接支持后)之后还是连不上,检查自己是否在bootloader模式下,如果是且连不上,下个刷机精灵来获得fastboot驱动。
本次root通过Recovery刷入SuperSu程序和对应的二进制文件来获得ROOT,这种方法并没有一键那么方便,但是却更加稳定。因为只是刷入了SuperSu程序和对应的二进制文件,并没有改变系统其他任何文件。

  • Recovery:用途主要是刷机(ROM),备份/还原系统。
  • SuperSU(权限管理):权限管理是一款对经过root的机器进行权限管理的应用。
  • Busybox:能够手机增加一些 LINUX/UNIX 基层指令,需要root权限才能执行的任务却需要这些指令,大多数使用情况下都用不到。(需要root权限)
  • Quick Boot:可以让你以多种模式(重)启动手机(正常模式、恢复模式、引导模式、热重启、关闭电源),支持在桌面添加多个模式的快捷方式,方便快速(重)启动手机。(需要root权限)
  • APN Backup & Restore:备份/恢复APN接入点配置信息。

 

textview的属性?android:attr/

?意味着你引用类型属性,?android:attr/listPreferredItemHeight意味着你用android命名空间内的listPreferredItemHeight这种属性。总的来说就是说给layout_height指定系统预定义的一个属性值。

?android:attr/textAppearanceLargeInverse //系统自带的一个外观

?表示系统是否有这种外观,否则使用默认的外观。 可选值:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse

  •  textView.getPaint().setFlags(Paint. UNDERLINE_TEXT_FLAG ); //下划线
  • textView.getPaint().setAntiAlias(true);//抗锯齿
  • textview.getPaint().setFlags(Paint. STRIKE_THRU_TEXT_FLAG); //中划线
  • setFlags(Paint. STRIKE_THRU_TEXT_FLAG|Paint.ANTI_ALIAS_FLAG);  // 设置中划线并加清晰
  • textView.getPaint().setFlags(0);  // 取消设置的的划线

android:drawablePadding

android:drawablePadding设置text与drawable(图片)的间隔,与drawableLeft、 drawableRight、drawableTop、drawableBottom一起使用,可设置为负数,单独使用没有效果。 android:drawablePadding 给上下左右的图片加间隔

setCompoundDrawablesWithIntrinsicBounds

TextView也可以直接绑定一个drawable对象显示的

  • void  setCompoundDrawables(Drawable left, Drawable top, Drawable right, Drawable bottom) 或
  • void  setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom) // int类型指定的资源id,方位则是textview什么位置显示drawable对象, 如left = Resource identifier of the left Drawable. 相当于:android:drawableLeft: The drawable to be drawn to the left of the text.
  • void  setCompoundDrawablesWithIntrinsicBounds(Drawable left, Drawable top, Drawable right, Drawable bottom)

setCompoundDrawables(Drawable left, top, right, bottom)

  • 画的drawable的宽高是按drawable.setBound()设置的宽高,所以使用之前必须使用Drawable.setBounds设置Drawable的长宽, The Drawables must already have had setBounds(Rect) called
    •  Drawable d1 = rr.getCompoundDrawables()[1];  //此处取的是android:drawableTop的图片
      drawable.setBounds(0, 0, d1.getIntrinsicWidth(), d1.getIntrinsicHeight());//  getIntrinsicWidth()取得的是Drawable在手机上的宽度,所以不同分辨率下获取到的值是不同的,关键所在处
  • setCompoundDrawablesWithIntrinsicBoundsdrawable画的宽高是按drawable固定的宽高,即通过getIntrinsicWidth()与getIntrinsicHeight()获得,The Drawables’ bounds will be set to their intrinsic bounds
  • 要想达到相同效果: 自定义zoomDrawable()

Drawable draw1 = this.getResources().getDrawable(R.drawable.srvmng);

int w = draw1.getIntrinsicWidth();    

        int h = draw1.getIntrinsicHeight();    

Rect rect = draw1.getBounds();

text1.setCompoundDrawablesWithIntrinsicBounds(null, zoomDrawable(draw1,32,32), null,null);

<TextView
android:id=”@+id/item1″
android:layout_width=”fill_parent”
android:layout_height=”40.0dip”
android:layout_alignLeft=”@+id/scenic_icon”
android:layout_below=”@+id/consume”
android:layout_marginTop=”10dp”
android:background=”@drawable/scenic_details_item_bg”
android:drawableLeft=”@drawable/sight_1
android:drawablePadding=”10.0dip”
android:drawableRight=”@drawable/back_light
android:gravity=”center_vertical”
android:padding=”10.0dip”
android:text=”景区地图自动导游”
android:textColor=”@color/grey_textcolor” />

让TextView后面的Layout响应Click事件

有一个Layout(LinearLayout或者RelativeLayout)作为背景,他有一个TextView作为子元素,当点击TextView控件时,想让它所在的Layout响应。这个问题其实有两个解决方法:

  • 在它的父Layout中声明clickable为true: 这种方法判断长按事件有时候会失效

<TextView
android:id=”@+id/my_recent_voice_edit”
android:layout_width=”148.3dp”
android:layout_height=”wrap_content”
android:duplicateParentState=”true”
android:gravity=”center”
android:text=”@string/voice_recent_btn_text”
android:textColor=”@color/textviewcolor
android:layout_marginBottom=”1dp”
android:clickable=”true” //可点击
android:textSize=”12sp” />

  • 屏蔽Layout的子元素获取焦点。后一种方法中不能为TextView指定selector了

<LinearLayout
android:id=”@+id/voice_recent_edit_layout”
android:layout_width=”193.3dp”
android:layout_height=”wrap_content”
android:layout_marginLeft=”33dp”
android:layout_marginRight=”33dp”
android:background=”@drawable/recent_voice_bg”
  android:clickable=”true”
            android:descendantFocusability=”blocksDescendants”
android:gravity=”center_vertical”
android:visibility=”gone” >

定义颜色res/color/textviewcolor.xml

<?xml version=”1.0″ encoding=”utf-8″?>
<selector xmlns:android=”http://schemas.android.com/apk/res/android”>
<item android:state_selected=”true” android:color=”#ff0000″ />
<item android:state_focused=”true” android:color=”#ff0000″ />
<item android:state_pressed=”true” android:color=”#ff0000″ />
<item android:color=”#89683B” />
</selector>

E.G.

image imageimage

三个按钮是三个TextView派生类实例,中间的白线,是1px宽的白色矩形:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"

android:layout_width="fill_parent"
android:layout_height="fill_parent" android:background="@drawable/background_color">
<LinearLayout android:layout_width="fill_parent"
android:layout_height="10dip" />
<LinearLayout android:layout_width="fill_parent"
android:layout_height="40dip">

<com.easymorse.textbutton.TextButton
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:layout_weight="1" android:text="电影" android:gravity="center_vertical|center_horizontal"
android:background="@drawable/button" android:focusable="true" android:clickable="true"/>

<View android:layout_width="2px" android:layout_height="fill_parent" android:background="#ffffffff" />

<com.easymorse.textbutton.TextButton android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true"
android:layout_weight="1" android:text="电视" android:gravity="center_vertical|center_horizontal"
android:background="@drawable/button" android:focusable="true" />

<View android:layout_width="2px" android:layout_height="fill_parent"android:background="#ffffffff" />

<com.easymorse.textbutton.TextButton android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true"
android:layout_weight="1" android:text="明星" android:gravity="center_vertical|center_horizontal"
android:background="@drawable/button" android:focusable="true" />

</LinearLayout>
</LinearLayout>

在按钮布局中要使用android:focusable=”true” android:clickable=”true”,这样才能比如通过轨迹球聚焦到按钮上,才能用手触摸按钮的时候触发事件, 点击按钮变色,主要在android:background=”@drawable/button”配置,button配置了点击事件发生后的背景色改变,而不需要编写代码

TextView中的个别字设置为超链接,或者设置个别字的颜色、字体等,那就需要用到Spannable对象

Intent 用法实例

intent 是一个保存着消息内容的Intent对 象。对于activity和服务来说,它指明了请求的操作名称以及作为操作对象的数据的URI和其它一些信息。比如说,它可以承载对一个activity 的请求,让它为用户显示一张图片,或者让用户编辑一些文本。而对于广播接收器而言,Intent对象指明了声明的行为。比如,它可以对所有感兴趣的对象声 明照相按钮被按下。

setType用来设置intent 里数据的类型,表示要查找文件的mime类型(如*/*),这个和组件在manifest里定义的相对应,但在源代码里:会将type设为null。

//这个类型函数是自己工具类的方法,你可以自己设置文件类型,例如图片文件:image/*
  //不想写类型直接*/*也是可以的
intent.setType(“audio/*”);

1.无参数Activity跳转
Intent it = new Intent(Activity.Main.this, Activity2.class);
startActivity(it);

2.向下一个Activity传递数据(使用Bundle和Intent.putExtras
Intent it = new Intent(Activity.Main.this, Activity2.class);
Bundle bundle=new Bundle();
bundle.putString(“name”, “This is from MainActivity!”);
it.putExtras(bundle);       // it.putExtra(“test”, “shuju”);
startActivity(it);            // startActivityForResult(it,REQUEST_CODE);
对于数据的获取可以采用:
Bundle bundle=getIntent().getExtras();String name=bundle.getString(“name”);

3.向上一个Activity返回结果(使用setResult,针对startActivityForResult(it,REQUEST_CODE)启动的Activity)

如果它期望它所启动的那个 activity返回一个结果,它会以调用startActivityForResult()来取代startActivity()

如果它启动 了另外一个activity以使用户挑选一张照片,它也许想知道哪张照片被选中了。结果将会被封装在一个Intent对象中,并传递给发出调用的 activity的onActivityResult() 方法

Intent intent=getIntent();
Bundle bundle2=new Bundle();
bundle2.putString(“name”, “This is from ShowMsg!”);
intent.putExtras(bundle2);
setResult(RESULT_OK, intent);

4.回调上一个Activity的结果处理函数(onActivityResult)

Intent的两种基本用法

  • 一种是显式的Intent,即在构造Intent对象时就指定接收者;
  • 另一种是隐式的Intent,即Intent的发送者在构造Intent对象时,并不知道也不关心接收者是谁,有利于降低发送者和接收者之间的耦合。Android需要解析隐式Intent,通过解析,将 Intent映射给可以处理此Intent的Activity、IntentReceiver或Service

Intent解析机制

主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的Intent,最终找到匹配的Intent。在这个解析过程中,Android是通过Intent的action、type、category这三个属性来进行判断的,判断方法如下:

· 如果Intent指明定了action,则目标组件的IntentFilter的action列表中就必须包含有这个action,否则不能匹配;

· 如果Intent没有提供type,系统将从data中得到数据类型。和action一样,目标组件的数据类型列表中必须包含Intent的数据类型,否则不能匹配。

· 如果Intent中的数据不是content: 类型的URI,而且Intent也没有明确指定它的type,将根据Intent中数据的scheme (比如 http: 或者mailto:) 进行匹配。同上,Intent 的scheme必须出现在目标组件的scheme列表中。

· 如果Intent指定了一个或多个category,这些类别必须全部出现在组建的类别列表中。比如Intent中包含了两个类别:LAUNCHER_CATEGORY 和 ALTERNATIVE_CATEGORY,解析得到的目标组件必须至少包含这两个类别。

 // 调用浏览器  

    Uri webViewUri = Uri.parse("http://blog.csdn.net/zuolongsnail");  
    Intent intent = new Intent(Intent.ACTION_VIEW, webViewUri);  

    // 调用地图  
    Uri mapUri = Uri.parse("geo:100,100");  
    Intent intent = new Intent(Intent.ACTION_VIEW, mapUri);  

    // 播放mp3  
    Uri playUri = Uri.parse("file:///sdcard/test.mp3");  
    Intent intent = new Intent(Intent.ACTION_VIEW, playUri);  
    intent.setDataAndType(playUri, "audio/mp3");  

    // 调用拨打电话  
    Uri dialUri = Uri.parse("tel:10086");  
    Intent intent = new Intent(Intent.ACTION_DIAL, dialUri);  
    // 直接拨打电话,需要加上权限<uses-permission id="android.permission.CALL_PHONE" />  
    Uri callUri = Uri.parse("tel:10086");  
    Intent intent = new Intent(Intent.ACTION_CALL, callUri);  

    // 调用发邮件(这里要事先配置好的系统Email,否则是调不出发邮件界面的)  
    Uri emailUri = Uri.parse("mailto:zuolongsnail@163.com");  
    Intent intent = new Intent(Intent.ACTION_SENDTO, emailUri);  
    // 直接发邮件  
    Intent intent = new Intent(Intent.ACTION_SEND);  
    String[] tos = { "zuolongsnail@gmail.com" };  
    String[] ccs = { "zuolongsnail@163.com" };  
    intent.putExtra(Intent.EXTRA_EMAIL, tos);  
    intent.putExtra(Intent.EXTRA_CC, ccs);  
    intent.putExtra(Intent.EXTRA_TEXT, "the email text");  
    intent.putExtra(Intent.EXTRA_SUBJECT, "subject");  
    intent.setType("text/plain");  
    Intent.createChooser(intent, "Choose Email Client");  

    // 发短信  
    Intent intent = new Intent(Intent.ACTION_VIEW);  
    intent.putExtra("sms_body", "the sms text");  
    intent.setType("vnd.android-dir/mms-sms");  
    // 直接发短信  
    Uri smsToUri = Uri.parse("smsto:10086");  
    Intent intent = new Intent(Intent.ACTION_SENDTO, smsToUri);  
    intent.putExtra("sms_body", "the sms text");  
    // 发彩信  
    Uri mmsUri = Uri.parse("content://media/external/images/media/23");  
    Intent intent = new Intent(Intent.ACTION_SEND);  
    intent.putExtra("sms_body", "the sms text");  
    intent.putExtra(Intent.EXTRA_STREAM, mmsUri);  
    intent.setType("image/png");  

    // 卸载应用  
    Uri uninstallUri = Uri.fromParts("package", "com.app.test", null);  
    Intent intent = new Intent(Intent.ACTION_DELETE, uninstallUri);  
    // 安装应用  
    Intent intent = new Intent(Intent.ACTION_VIEW);  
    intent.setDataAndType(Uri.fromFile(new File("/sdcard/test.apk"), "application/vnd.android.package-archive");  

    // 在Android Market中查找应用  
    Uri uri = Uri.parse("market://search?q=愤怒的小鸟");           
    Intent intent = new Intent(Intent.ACTION_VIEW, uri);

path左右两个不同菜单如何实现

对于抽屉式菜单的首创者,争论的比较多,大部分人认为是Feedly(就是两天拿下 GR50万用户的那个)首先使用的(也有人说是Google)。后来Facebook开始使用,进一步被人所熟悉,在后来Path使用了左右双抽屉式菜单,大家被这种自然流畅的方式惊到了,便纷纷效仿。现在抽屉式菜单应用的也非常广泛。但有趣的是,像下拉刷新的下拉黏性与长度一样,交互设计师对“左右抽屉”的宽度也有着非常不同的理解,有的占到4/5,有的则只占到1/2。

抽屉式菜单适合单页面中心的信息架构,即App只有一个中枢性的页面80%以上时间在这里停留,所以才要削弱导航带来的干扰,也给内容中枢留出更多的显示空间。抽屉式导航必定会大幅度降低中枢之外其他页面的访问。对蝉游记作可用性测试反馈分析的结果是,用户非常不情愿点击陌生的功能icon,除非他能准确预知其结果。用户注意力很容易被内容区域,以及醒目的文字按钮吸引过去,并因此而忽略掉图标的存在。

两个菜单一起显示,判断滑动事件,显示右边的时候隐藏掉左边的View,显示左边的隐藏掉右边的view

在RelativaLayout中设置好菜单布局,然后在监听事件中使其显示/隐藏。onCreate函数尽量简洁,能封装出去的就封装出去,然后调用就可以了。设置一个变量 clickCount来代表该显示还是该隐藏视图。

同时弹出顶部和底部菜单的做法

 

GridView 详解及拓展

android:verticalSpacing=”10dp”  //行宽
android:horizontalSpacing=”10dip”  //列宽
android:numColumns=”3″  //列数

android:stretchMode=”columnWidth”  //列可扩展

以上列数为3,若想在高分辨率中列数设置为4

首先,需要在属性中设置列为可扩展android:stretchMode=”columnWidth”。然后在代码中做个判断:

if(Metrics.heightPixels == 1280 && Metrics.widthPixels == 800){
gridview.setNumColumns(4);
}这样GridView的列数是可以随分辨率不同而做更多的设置。

stretchMode属性值的作用是设置GridView中的条目以什么缩放模式去填充空间。参数stretchMode 可选值:

  • NO_STRETCH,
  • STRETCH_SPACING,
  • STRETCH_SPACING_UNIFORM,
  • STRETCH_COLUMN_WIDTH

设置个边框,并且右上角设置个CheckBox来美化选中状态

    

边框:

ImageView 要设置一个属性:android:layout_margin=”4dip” //上下左右留出4dip的具体来显示边框的效果。

并且在相应的Adapter中做个判断,选中的话背景图片颜色为#87CEFA,未选中时为3FFFFFF:

if(bSelect){ //bSelect表示是否选中
arg1.setBackgroundColor(Color.parseColor(“#87CEFA”));
}else{
arg1.setBackgroundColor(Color.parseColor(“#FFFFFF”));}

Gridview 中 android:layout_margin=”10dp”

GridView中设置了Button以后就不能响应OnItemClick()

当我们在GridView或者ListView里面设置了Textiew的时候,假如我们不给Textiew设置onlick()的话,那么 Gridiew的OnItemClick()就是可以执行的,但是当把TextView换成是Button的时候我们也不设置onClick()的话,GridView的OnItemClick()也是不能执行的

说明Button和TextView内部事件方面有区别,去查看 Button的源代码,代码很少就这么几句
public class Button extends TextView {
public Button(Context context) {
this(context, null);
}

public Button(Context context, AttributeSet attrs) {
this(context, attrs, com.android.internal.R.attr.buttonStyle);
}

public Button(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
所以,主要的猫腻还是在com.android.internal.R.attr.buttonStyle这个里面,查看这个xml文件,Button设置多了两个属性如下:
<item name=”android:focusable”>true</item>
<item name=”android:clickable”>true</item>
所以我们要在代码里面把这两个属性设为false,这样就可以响应GridView的onItemClick方法了,因为button拦截了点击事件,你也可以试下给button设置监听器,button肯定可以得到点击事件。

GridView点击item不响应
gridView.setOnItemClickListener(new OnItemClickListener() {});
点击每一个item的时候没有反应,无法获取的焦点。原因多半是由于在你自己定义的Item中存在诸如ImageButton,Button,CheckBox等子控件(也可以说是Button或者Checkable的子类控件),此时这些子控件会将焦点获取到,所以常常当点击item时变化的是子控件,item本身的点击没有响应

该属性是当一个为view获取焦点时,定义viewGroup和其子控件两者之间的关系。

属性的值有三种:

  • beforeDescendants:viewgroup优先其子类控件获取到焦点
  • afterDescendants:viewgroup只有当其子类控件不需要获取焦点时才获取焦点
  • blocksDescendants:viewgroup会覆盖子类控件而直接获得焦点

通常我们用到的是第三种,即在Item布局的根布局加上android:descendantFocusability=”blocksDescendants”的属性就好了,至此listview点击的灵异事件告一段落。

本身 GridView就会监听到点击事件,当你点击LinearLayout的时候,点击事件会向下传递。要是不想让gridView相应点击事件,那就让LinearLayout拦截点击事件,不让事件向下传递,GridView本身就有点击每一个iten的默认事件,所以外层的LinearLayout点击效果无效,如果只对LinearLayout产生点击效果,LinearLayout需要设置属性Clickable=“true”

gridview 中按钮事件

给Button或ImageButton加上这个android:focusable=”false”属性
给GridView的每一个item的布局文件中的最外层的layout加上这个属性android:descendantFocusability=”blocksDescendants”

 

viewpager上下滑动

为了实现左右滑动和上下滑动的灵活性,在ViewPager子类里实现了自定义的手势GestureDetector。

测试时,在一个商品上不停的点击、进入浏览器、返回、再点击、再返回,连续三、四次之后,就被困在一个ViewPager页面里出不来了,左右滑动失灵。并且能够屡次重现。

后来在能加Log的地方都加上Log,一句一句的跟踪,发现是LongPress造成的,ViewPager如果接收了LongPress事件,左右滑动立马失灵。

增加了一行代码:mGestureDetector.setIsLongpressEnabled(false);

将LongPress禁用。一切恢复正常。

ListView在ViewPager中导致左右滑动失效

下面是GestureDetector 这个类的概括情况

  • 首先,Android事件处理机制是基于Listener实现的,比如触摸屏相关的事件,就是通过onTouchListener实现;
  • 其次,所有View的子类都可以通过setOnTouchListener()、setOnKeyListener()等方法来添加对某一类事件的Listener
  • 第三,Listener一般会以Interface的方式来提供,其中包含一个或多个abstract方法,我们需要实现这些方法来完成onTouch()、onKey()等操作。这样,程序便可以在特定的事件被dispatch到该view的时候,通过callback函数给予适当的响应。

根据 MotionEvent事件检测各种手势,通过MotionEventgetAction()方法来获取Touch事件的类型,包括 ACTION_DOWN(按下触摸屏), ACTION_MOVE(按下触摸屏后移动受力点), ACTION_UP(松开触摸屏)和ACTION_CANCEL不会由用户直接触发)。借助对于用户不同操作的判断,结合getRawX()、getRawY()、getX()和getY()等方法来获取坐标后,我们可以实现诸如拖动某一个按钮,拖动滚动条等功能。

当我们捕捉到Touch操作的时候,如何识别出用户的Gesture?

Android中的Gesture识别(detector)是通过GestureDetector.OnGestureListener接口实现的。

GestureDetector.OnGestureListener 回调函数用于通知用户发生的手势动作。该类仅处理MotionEvent 事件中的触摸事件(不处理轨迹球事件)。 使用该类的方法如下:

首先需要在初始化的时候创建GestureDetector对象实例:

  • 接口 OnDoubleTapListener 手势监听器 用于双击时发出通知
  • 接口 OnGestureListener 手势监听器 用于发送手势操作时发生通知 如 拖动,长按,按下,弹起 等手势操作
    • onDown(MotionEvente)  //当轻触手势按下屏幕 时发生的事件
    • onFling(MotionEvent e1, MotionEvente2, float velocityX, float velocityY) //快速滑动后抬起事件的通知.由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
    • onLongPress(MotionEvente) //长按时的通知事件,由多个MotionEvent ACTION_DOWN触发
    • onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)  //滑动屏幕时通知事件 为了方便提供了X轴和Y轴上的滚动距离.由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
    • onShowPress(MotionEvente)  //当用户长点击后抬起时通知事件,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
    • onSingleTapUp(MotionEvente)  //当轻触手势抬起屏幕时发生的事件.由一个1个MotionEvent ACTION_UP触发
  • SimpleOnGestureListener – GestureDetector的扩展类 这个类的作用是当我们只想使用部分手势时, 而非全部的时候 就可以继承这个类

在实际应用中 我们根据我们所需要的功能实现不同的接口 或者 继承自SimpleOnGestureListener 类,只实现部分个人需要的方法 就可以了

Meaning of java.lang.ClassCastException

According to the documentation:

Thrown to indicate that the code has attempted to cast an Object to a subclass of which it is not an instance. For example, the following code generates a ClassCastException:

Object x = new Integer(0);
System.out.println((String)x); 

[error]View requires API level 3 (current min is 1):

A HorizontalScrollView is a FrameLayout, meaning you should place one child in it containing the entire contents to scroll; this child may itself be a layout manager with a complex hierarchy of objects. A child that is often used is a LinearLayout in a horizontal orientation, presenting a horizontal array of top-level items that the user can scroll through.

The TextView class also takes care of its own scrolling, so does not require a HorizontalScrollView, but using the two together is possible to achieve the effect of a text view within a larger container.

HorizontalScrollView only supports horizontal scrolling. For vertical scrolling, use either ScrollView or ListView.

solution:

Right click on the project folder > Android tools > Clear Link Markers

“Run Android Lint” makes some markers and the markers cause this error.

生活在西班牙

自己动手丰衣足食

BlueAsteroid

Just another WordPress.com site

Jing's Blog

Just another WordPress.com site

Start from here......

我的心情魔方

天才遠私廚

希望能做一個分享各種資訊的好地方

语义噪声

西瓜大丸子汤的博客

笑对人生,傲立寰宇

Just another WordPress.com site

Where On Earth Is Waldo?

A Project By Melanie Coles

the Serious Computer Vision Blog

A blog about computer vision and serious stuff

Cauthy's Blog

paper review...

Cornell Computer Vision Seminar Blog

Blog for CS 7670 - Special Topics in Computer Vision

datarazzi

Life through nerd-colored glasses

Luciana Haill

Brainwaves Augmenting Consciousness

槑烎

1,2,∞

Dr Paul Tennent

and the university of nottingham

turn off the lights, please

A bunch of random, thinned and stateless thoughts around the Web

John's Weblog

Just another WordPress.com weblog