Android开发之拍照功能实现(附源码)

大家好,这是一个简单的拍照功能,很简单的界面,一个显示图像区域SurfaceView一个“拍照”按钮。直接上代码! 1、CameraDemoActivity.java(主界面) - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">package</span> org.winplus.camera; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> java.io.File; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> java.io.FileOutputStream; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> java.io.IOException; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> java.util.Date; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.app.Activity; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.content.pm.ActivityInfo; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.graphics.PixelFormat; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.hardware.Camera; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.os.AsyncTask; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.os.Bundle; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.os.Environment; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.text.format.DateFormat; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.util.Log; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.view.KeyEvent; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.view.SurfaceHolder; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.view.SurfaceView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.view.Window; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.view.View.OnClickListener; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">import</span> android.widget.Button; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">class</span> CameraDemoActivity <span class="keyword" style="font-weight: bold; color: #0000ff;">extends</span> Activity{ </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">final</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">static</span> String TAG = <span class="string" style="color: #009900;">&#8220;CameraActivity&#8221;</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> SurfaceView surfaceView; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> SurfaceHolder surfaceHolder; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> Camera camera; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> File picture; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> Button btnSave; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">this</span>.requestWindowFeature(Window.FEATURE_NO_TITLE); </span> - <span style="color: black;"> setContentView(R.layout.main); </span> - <span style="color: black;"> setupViews(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> setupViews(){ </span> - <span style="color: black;"> surfaceView = (SurfaceView) findViewById(R.id.camera_preview); <span class="comment" style="color: #999999;">// Camera interface to instantiate components</span> </span> - <span style="color: black;"> surfaceHolder = surfaceView.getHolder(); <span class="comment" style="color: #999999;">// Camera interface to instantiate components</span> </span> - <span style="color: black;"> surfaceHolder.addCallback(surfaceCallback); <span class="comment" style="color: #999999;">// Add a callback for the SurfaceHolder</span> </span> - <span style="color: black;"> surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); </span> - <span style="color: black;"> </span> - <span style="color: black;"> btnSave = (Button) findViewById(R.id.save_pic); </span> - <span style="color: black;"> </span> - <span style="color: black;"> btnSave.setOnClickListener(<span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> OnClickListener() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> onClick(View v) { </span> - <span style="color: black;"> takePic(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">boolean</span> onKeyDown(<span class="keyword" style="font-weight: bold; color: #0000ff;">int</span> keyCode, KeyEvent event) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">if</span> (keyCode == KeyEvent.KEYCODE_CAMERA </span> - <span style="color: black;"> || keyCode == KeyEvent.KEYCODE_SEARCH) { </span> - <span style="color: black;"> takePic(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">return</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">return</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">super</span>.onKeyDown(keyCode, event); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">private</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> takePic() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> camera.stopPreview();<span class="comment" style="color: #999999;">// stop the preview</span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> camera.takePicture(<span class="keyword" style="font-weight: bold; color: #0000ff;">null</span>, <span class="keyword" style="font-weight: bold; color: #0000ff;">null</span>, pictureCallback); <span class="comment" style="color: #999999;">// picture</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="comment" style="color: #999999;">// Photo call back</span> </span> - <span style="color: black;"> Camera.PictureCallback pictureCallback = <span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> Camera.PictureCallback() { </span> - <span style="color: black;"> <span class="comment" style="color: #999999;">//@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> onPictureTaken(<span class="keyword" style="font-weight: bold; color: #0000ff;">byte</span>[] data, Camera camera) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> SavePictureTask().execute(data); </span> - <span style="color: black;"> camera.startPreview(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="comment" style="color: #999999;">// save pic</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">class</span> SavePictureTask <span class="keyword" style="font-weight: bold; color: #0000ff;">extends</span> AsyncTask<<span class="keyword" style="font-weight: bold; color: #0000ff;">byte</span>[], String, String> { </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">protected</span> String doInBackground(<span class="keyword" style="font-weight: bold; color: #0000ff;">byte</span>[]&#8230; params) { </span> - <span style="color: black;"> String fname = DateFormat.format(<span class="string" style="color: #009900;">&#8220;yyyyMMddhhmmss&#8221;</span>, <span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> Date()).toString()+<span class="string" style="color: #009900;">&#8220;.jpg&#8221;</span>; </span> - <span style="color: black;"> </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: #009900;">&#8220;fname=&#8221;</span>+fname+<span class="string" style="color: #009900;">&#8220;;dir=&#8221;</span>+Environment.getExternalStorageDirectory()); </span> - <span style="color: black;"> <span class="comment" style="color: #999999;">//picture = new File(Environment.getExternalStorageDirectory(),fname);// create file</span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> picture = <span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> File(Environment.getExternalStorageDirectory()+<span class="string" style="color: #009900;">&#8220;/&#8221;</span>+fname); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">try</span> { </span> - <span style="color: black;"> FileOutputStream fos = <span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> FileOutputStream(picture.getPath()); <span class="comment" style="color: #999999;">// Get file output stream</span> </span> - <span style="color: black;"> fos.write(params[<span class="number" style="color: #c00000;"></span>]); <span class="comment" style="color: #999999;">// Written to the file</span> </span> - <span style="color: black;"> fos.close(); </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #0000ff;">catch</span> (Exception e) { </span> - <span style="color: black;"> e.printStackTrace(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">return</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">null</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="comment" style="color: #999999;">// SurfaceHodler Callback handle to open the camera, off camera and photo size changes</span> </span> - <span style="color: black;"> SurfaceHolder.Callback surfaceCallback = <span class="keyword" style="font-weight: bold; color: #0000ff;">new</span> SurfaceHolder.Callback() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> surfaceCreated(SurfaceHolder holder) { </span> - <span style="color: black;"> Log.i(TAG, <span class="string" style="color: #009900;">&#8220;surfaceCallback====&#8221;</span>); </span> - <span style="color: black;"> camera = Camera.open(); <span class="comment" style="color: #999999;">// Turn on the camera</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">try</span> { </span> - <span style="color: black;"> camera.setPreviewDisplay(holder); <span class="comment" style="color: #999999;">// Set Preview</span> </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #0000ff;">catch</span> (IOException e) { </span> - <span style="color: black;"> camera.release();<span class="comment" style="color: #999999;">// release camera</span> </span> - <span style="color: black;"> camera = <span class="keyword" style="font-weight: bold; color: #0000ff;">null</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> surfaceChanged(SurfaceHolder holder, <span class="keyword" style="font-weight: bold; color: #0000ff;">int</span> format, <span class="keyword" style="font-weight: bold; color: #0000ff;">int</span> width, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">int</span> height) { </span> - <span style="color: black;"> Log.i(TAG,<span class="string" style="color: #009900;">&#8220;====surfaceChanged&#8221;</span>); </span> - <span style="color: black;"> Camera.Parameters parameters = camera.getParameters(); <span class="comment" style="color: #999999;">// Camera parameters to obtain</span> </span> - <span style="color: black;"> parameters.setPictureFormat(PixelFormat.JPEG);<span class="comment" style="color: #999999;">// Setting Picture Format</span> </span> - <span style="color: black;"><span class="comment" style="color: #999999;">// parameters.set(&#8220;rotation&#8221;, 180); // Arbitrary rotation</span> </span> - <span style="color: black;"> camera.setDisplayOrientation(<span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"><span class="comment" style="color: #999999;">// parameters.setPreviewSize(400, 300); // Set Photo Size</span> </span> - <span style="color: black;"> camera.setParameters(parameters); <span class="comment" style="color: #999999;">// Setting camera parameters</span> </span> - <span style="color: black;"> camera.startPreview(); <span class="comment" style="color: #999999;">// Start Preview</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #0000ff;">public</span> <span class="keyword" style="font-weight: bold; color: #0000ff;">void</span> surfaceDestroyed(SurfaceHolder holder) { </span> - <span style="color: black;"> Log.i(TAG,<span class="string" style="color: #009900;">&#8220;====surfaceDestroyed&#8221;</span>); </span> - <span style="color: black;"> camera.stopPreview();<span class="comment" style="color: #999999;">// stop preview</span> </span> - <span style="color: black;"> camera.release(); <span class="comment" style="color: #999999;">// Release camera resources</span> </span> - <span style="color: black;"> camera = <span class="keyword" style="font-weight: bold; color: #0000ff;">null</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }; </span> - <span style="color: black;">} </span> <span style="color: #362e2b;">2、main.xml(布局文件)</span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><?</span><span class="tag-name" style="font-weight: bold; color: #993300;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: #993300;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">LinearLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;fill_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;fill_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:orientation</span>=<span class="attribute-value" style="color: blue;">&#8220;vertical&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">android.view.SurfaceView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/camera_preview&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;800dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;600dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_alignParentTop</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_centerInParent</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_gravity</span>=<span class="attribute-value" style="color: blue;">&#8220;center_vertical|center_horizontal&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">Button</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/save_pic&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;fill_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:text</span>=<span class="attribute-value" style="color: blue;">&#8220;@string/txt_save&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">LinearLayout</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> <br style="color: #362e2b;" /><span style="color: #362e2b;">3、别忘了添加权限:</span> <div class="dp-highlighter bg_html" style="color: #362e2b;"> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">uses-permission</span> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;android.permission.CAMERA&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">uses-feature</span> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;android.hardware.camera&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">uses-feature</span> <span class="attribute" style="color: red;">android:name</span>=<span class="attribute-value" style="color: blue;">&#8220;android.hardware.camera.autofocus&#8221;</span> <span class="attribute" style="color: red;">android:required</span>=<span class="attribute-value" style="color: blue;">&#8220;false&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> </div> <div class="dp-highlighter bg_html" style="color: #362e2b;"> - <span style="color: black;"> </span> </div> [源码下载==》](http://download.csdn.net/detail/tangcheng_ok/3874071) 原创文章,转载请注明出处:http://www.blog.csdn.net/tangcheng_ok

2014年8月24日 · 10 分钟 · 天边的星星

使用startForeground让android服务前台运行

最近在使用android 4.1系统的时候,发现在手机休眠一段时间后(1-2小时),后台运行的服务被强行kill掉,有可能是系统回收内存的一种机制,要想避免这种情况可以通过startForeground让服务前台运行,当stopservice的时候通过stopForeground去掉。以下是android官方描述:Running a Service in the Foreground A foreground service(前台服务) is a service that’s considered to be(被用户所认可的) something the user is actively aware of and thus not a candidate for(而不是一个候选的,可以在内存不足时,被系统杀死的) the system to kill when low on memory. A foreground service must provide a notification for the status bar(前台服务必须提供一个显示通知), which is placed under the “Ongoing” heading(它是不可以忽略的), which means that the notification cannot be dismissed unless the service is either stopped or removed from the foreground.(意思是通知信息不能被忽略,除非服务停止或主动移除,否则将一直显示。) For example, a music player that plays music from a service should be set to run in the foreground, because the user is explicitly aware of its operation(用户明确了解其运作). The notification in the status bar might indicate the current song and allow the user to launch an activity to interact with the music player.To request that your service run in the foreground, call startForeground(). This method takes two parameters: an integer that uniquely identifies the notification and the Notification for the status bar. For example:Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),System.currentTimeMillis());Intent notificationIntent = new Intent(this, ExampleActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);notification.setLatestEventInfo(this, getText(R.string.notification_title),getText(R.string.notification_message), pendingIntent);startForeground(ONGOING_NOTIFICATION, notification);To remove the service from the foreground, call stopForeground(). This method takes a boolean, indicating whether to remove the status bar notification as well. This method does not stop the service. However, if you stop the service while it’s still running in the foreground, then the notification is also removed. ...

2014年8月20日 · 2 分钟 · 天边的星星

Android开发:优化电池续航-监听电量和充电状态

翻自:http://developer.android.com/training/monitoring-device-state/battery-monitoring.html 当你在更改后台更新频率来减少这些更新对电池寿命的影响时,检查当前电量和充电状态是一个好的开始。 电池寿命通过剩余电量和充电状态来影响应用更新的执行。当用交流电充电时,执行更新操作对设备的影响是微不足道的,所以在大多数案例里,你可以把更新频率调到最快。如果设备不在充电,降低更新频率可以帮助延长电池寿命。 类似的,你可以检查电池剩余电量级别,在电量低时,应该降低更新频率甚至停止更新。 注:此处的更新,指的是类似发送心跳包的动作,或者定时更新内容。并非仅仅指更新应用版本。如果是用户动作,比如翻页刷新,不需要根据电量和充电状态处理。 判断当前充电状态 通过判断当前充电状态开始。BatteryManager会通过一个intent广播所有电池和充电详情,包含充电状态。 因为这是一个sticky intent,你不需要注册广播接收器。简单地通过调用 registerReceiver,像下面的代码段传入一个null的接收器,当前电池状态的intent就会返回。你也可以传入一个真实的接收器对象,但我们暂时不会操作更新,所以这是没必要的。 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 </td> <td class="code"> ``` IntentFilter ifilter <span style="color: #339933;">=</span> <span style="font-weight: bold;">new</span> IntentFilter<span style="color: #009900;">(</span>Intent.<span style="color: #006633;">ACTION_BATTERY_CHANGED</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> Intent batteryStatus <span style="color: #339933;">=</span> context.<span style="color: #006633;">registerReceiver</span><span style="color: #009900;">(</span><span style="font-weight: bold; color: #000066;">null</span>, ifilter<span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="font-style: italic; color: #666666;">//你可以读到充电状态,如果在充电,可以读到是usb还是交流电</span> <span style="font-style: italic; color: #666666;">// 是否在充电</span> <span style="font-weight: bold; color: #000066;">int</span> status <span style="color: #339933;">=</span> batteryStatus.<span style="color: #006633;">getIntExtra</span><span style="color: #009900;">(</span>BatteryManager.<span style="color: #006633;">EXTRA_STATUS</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="font-weight: bold; color: #000066;">boolean</span> isCharging <span style="color: #339933;">=</span> status <span style="color: #339933;">==</span> BatteryManager.<span style="color: #006633;">BATTERY_STATUS_CHARGING</span> <span style="color: #339933;">||</span> status <span style="color: #339933;">==</span> BatteryManager.<span style="color: #006633;">BATTERY_STATUS_FULL</span><span style="color: #339933;">;</span> <span style="font-style: italic; color: #666666;">// 怎么充</span> <span style="font-weight: bold; color: #000066;">int</span> chargePlug <span style="color: #339933;">=</span> batteryStatus.<span style="color: #006633;">getIntExtra</span><span style="color: #009900;">(</span>BatteryManager.<span style="color: #006633;">EXTRA_PLUGGED</span>, <span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">)</span><span style="color: #339933;">;</span> <span style="font-weight: bold; color: #000066;">boolean</span> usbCharge <span style="color: #339933;">=</span> chargePlug <span style="color: #339933;">==</span> BatteryManager.<span style="color: #006633;">BATTERY_PLUGGED_USB</span><span style="color: #339933;">;</span> <span style="font-weight: bold; color: #000066;">boolean</span> acCharge <span style="color: #339933;">=</span> chargePlug <span style="color: #339933;">==</span> BatteryManager.<span style="color: #006633;">BATTERY_PLUGGED_AC</span><span style="color: #339933;">;</span> </td> </tr> 通常你应该在使用交流电充电时最大化后台更新频率,在使用usb充电时降低,不充电时更低。 ...

2014年8月20日 · 4 分钟 · 天边的星星

Android DrawerLayout+ fragment 布局实现左右侧滑

技术要点: android.support.v4.widget.DrawerLayout 打开抽屉: DrawerLayout .openDrawer(); 关闭抽屉:DrawerLayout.closeDrawer( ); **为slidingLayout设置一个layout_grative属性 ** ** ** **中间![](http://www.2cto.com/uploadfile/Collfiles/20140226/20140226092627200.jpg) 左侧![](http://www.2cto.com/uploadfile/Collfiles/20140226/20140226092627201.jpg) 右侧 ![](http://www.2cto.com/uploadfile/Collfiles/20140226/20140226092627202.jpg) ** 点击first ![](http://www.2cto.com/uploadfile/Collfiles/20140226/20140226092627203.jpg) 点击second ![](http://www.2cto.com/uploadfile/Collfiles/20140226/20140226092628204.jpg) ** ** ** ** 代码: activity_main.xml <喎�”http://www.2cto.com/kf/ware/vc/” target=”_blank” class=”keylink”>vc3Ryb25nPjwvcD4KPHA+PHN0cm9uZz48L3N0cm9uZz48L3A+CjxwcmUgY2xhc3M9″brush:java;”><frameLayout android:id=”@+id/fragment_layout” android:layout_width=”fill_parent” android:layout_height=”fill_parent” > first.xml [?](http://www.2cto.com/kf/201402/281540.html#) <table style="font-weight: normal !important;" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="gutter" style="color: #afafaf !important;"> <div class="line number1 index0 alt2"> 1 </div> <div class="line number2 index1 alt1"> 2 </div> <div class="line number3 index2 alt2"> 3 </div> <div class="line number4 index3 alt1"> 4 </div> <div class="line number5 index4 alt2"> 5 </div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `&lt;linearlayout xmlns:android=``"&lt;a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android&lt;/a>"` `android:id=``"@+id/drawer_layout"` `android:layout_width=``"match_parent"` `android:layout_height=``"match_parent"` `android:orientation=``"vertical"``&gt;` </div> <div class="line number2 index1 alt1"> </div> <div class="line number3 index2 alt2"> ` ``&lt;textview android:id=``"@+id/textView1"` `android:layout_width=``"wrap_content"` `android:layout_height=``"wrap_content"` `android:text=``"first"` `android:textappearance=``"?android:attr/textAppearanceLarge"``&gt;` </div> <div class="line number4 index3 alt1"> ` ` </div> <div class="line number5 index4 alt2"> `&lt;/textview&gt;&lt;/linearlayout&gt;` </div> </div> </td> </tr> </table> ** second.xml** ...

2014年8月5日 · 13 分钟 · 天边的星星

Android SwipeRefreshLayout 官方下拉刷新控件介绍

下面App基本都有下拉刷新的功能,以前基本都使用XListView或者自己写一个下拉刷新,近期Google提供了一个官方的下拉刷新控件SwipeRefreshLayout,我感觉还不错啊,见惯了传统的下拉刷新,这个反而给人耳目一新的感觉(貌似知乎的APP已经使用这种下拉刷新了)。 Google也在官方网站给出了V4的兼容包: ![](http://img.blog.csdn.net/20140426143208625?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG1qNjIzNTY1Nzkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 顺便看一眼API呗: ![](http://img.blog.csdn.net/20140426143234968?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbG1qNjIzNTY1Nzkx/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 和XlistView差不多,还是很方便使用的,大概就这4个常用的方法,下面贴个简单的例子。 1、布局文件: &nbsp; **[html]** [view plain](http://blog.csdn.net/lmj623565791/article/details/24521483#)[copy](http://blog.csdn.net/lmj623565791/article/details/24521483#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/313476)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/313476/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">RelativeLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">android.support.v4.widget.SwipeRefreshLayout</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/id_swipe_ly&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">ListView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/id_listview&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">ListView</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">android.support.v4.widget.SwipeRefreshLayout</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">RelativeLayout</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span> 2、MainActivty:&nbsp; &nbsp; **[java]** [view plain](http://blog.csdn.net/lmj623565791/article/details/24521483#)[copy](http://blog.csdn.net/lmj623565791/article/details/24521483#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/313476)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/313476/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="comment" style="color: #008200;">/*</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * Created by Storm Zhang, Mar 31, 2014.</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> */</span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">package</span> com.zhy.swiperefreshlayoutdemo; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> java.util.ArrayList; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> java.util.Arrays; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> java.util.List; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.annotation.SuppressLint; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.app.Activity; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.os.Bundle; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.os.Handler; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.support.v4.widget.SwipeRefreshLayout; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.util.Log; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.widget.ArrayAdapter; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.widget.ListView; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">class</span> MainActivity <span class="keyword" style="font-weight: bold; color: #006699;">extends</span> Activity <span class="keyword" style="font-weight: bold; color: #006699;">implements</span> SwipeRefreshLayout.OnRefreshListener </span> - <span style="color: black;">{ </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> <span class="keyword" style="font-weight: bold; color: #006699;">static</span> <span class="keyword" style="font-weight: bold; color: #006699;">final</span> <span class="keyword" style="font-weight: bold; color: #006699;">int</span> REFRESH_COMPLETE = <span class="number" style="color: #c00000;">0X110</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> SwipeRefreshLayout mSwipeLayout; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> ListView mListView; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> ArrayAdapter<String> mAdapter; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> List<String> mDatas = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> ArrayList<String>(Arrays.asList(<span class="string" style="color: blue;">&#8220;Java&#8221;</span>, <span class="string" style="color: blue;">&#8220;Javascript&#8221;</span>, <span class="string" style="color: blue;">&#8220;C++&#8221;</span>, <span class="string" style="color: blue;">&#8220;Ruby&#8221;</span>, <span class="string" style="color: blue;">&#8220;Json&#8221;</span>, </span> - <span style="color: black;"> <span class="string" style="color: blue;">&#8220;HTML&#8221;</span>)); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">private</span> Handler mHandler = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> Handler() </span> - <span style="color: black;"> { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> handleMessage(android.os.Message msg) </span> - <span style="color: black;"> { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">switch</span> (msg.what) </span> - <span style="color: black;"> { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">case</span> REFRESH_COMPLETE: </span> - <span style="color: black;"> mDatas.addAll(Arrays.asList(<span class="string" style="color: blue;">&#8220;Lucene&#8221;</span>, <span class="string" style="color: blue;">&#8220;Canvas&#8221;</span>, <span class="string" style="color: blue;">&#8220;Bitmap&#8221;</span>)); </span> - <span style="color: black;"> mAdapter.notifyDataSetChanged(); </span> - <span style="color: black;"> mSwipeLayout.setRefreshing(<span class="keyword" style="font-weight: bold; color: #006699;">false</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">break</span>; </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }; </span> - <span style="color: black;"> }; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@SuppressLint</span>(<span class="string" style="color: blue;">&#8220;InlinedApi&#8221;</span>) </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">protected</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onCreate(Bundle savedInstanceState) </span> - <span style="color: black;"> { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> setContentView(R.layout.activity_main); </span> - <span style="color: black;"> </span> - <span style="color: black;"> mListView = (ListView) findViewById(R.id.id_listview); </span> - <span style="color: black;"> mSwipeLayout = (SwipeRefreshLayout) findViewById(R.id.id_swipe_ly); </span> - <span style="color: black;"> </span> - <span style="color: black;"> mSwipeLayout.setOnRefreshListener(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>); </span> - <span style="color: black;"> mSwipeLayout.setColorScheme(android.R.color.holo_blue_bright, android.R.color.holo_green_light, </span> - <span style="color: black;"> android.R.color.holo_orange_light, android.R.color.holo_red_light); </span> - <span style="color: black;"> mAdapter = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> ArrayAdapter<String>(<span class="keyword" style="font-weight: bold; color: #006699;">this</span>, android.R.layout.simple_list_item_1, mDatas); </span> - <span style="color: black;"> mListView.setAdapter(mAdapter); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onRefresh() </span> - <span style="color: black;"> { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// Log.e(&#8220;xxx&#8221;, Thread.currentThread().getName());</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// UI Thread</span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> mHandler.sendEmptyMessageDelayed(REFRESH_COMPLETE, <span class="number" style="color: #c00000;">2000</span>); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> 好了,结束,我感觉效果挺好看的,不妨试试。&nbsp; 效果图: ![](http://img.blog.csdn.net/20140426144728031) &nbsp; &nbsp; ok ~ &nbsp; [源码点击此处下载](http://download.csdn.net/detail/lmj623565791/7256271) 转载:http://blog.csdn.net/lmj623565791/article/details/24521483 3 踩

2014年8月5日 · 5 分钟 · 天边的星星

Android之监测手机网络状态的广播

今天具体说下Android检测网络状态的广播,我们在做一些手机应用的时候如果网络发生改变可能会给用户造成一些损失,在中国2G,3G网络都没有普及的情况下,基本都是包流量的,所以在做一些视频应用软件的时候,如果用户在使用WIFI的时候如果无线网络中断,手机网络会自动换手机网络,从而给用户造成不必要的损失。 Android手机在对于一些系统广播,如短信的接收,电话的接收,电池电量过低,网络状态改变都会发一个广播,既然系统会发送一条广播,那么就需要一个接收器来处理这个广播。首先定义一个类继承NetworkChangeReceiver,重写onReceive()就行了。然后在OnReceive()这个方法进行相应广播的处理。 网络状态切换的广播类: **[java]** [view plain](http://blog.csdn.net/lonely_fireworks/article/details/7373166#)[copy](http://blog.csdn.net/lonely_fireworks/article/details/7373166#) <div> </div> </div> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">package</span> com.test; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.content.BroadcastReceiver; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.content.Context; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.content.Intent; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.net.ConnectivityManager; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">import</span> android.net.NetworkInfo.State; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">class</span> <span class="keyword" style="font-weight: bold; color: #006699;">extends</span> BroadcastReceiver { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onReceive(Context context, Intent intent) { </span> - <span style="color: black;"> State wifiState = <span class="keyword" style="font-weight: bold; color: #006699;">null</span>; </span> - <span style="color: black;"> State mobileState = <span class="keyword" style="font-weight: bold; color: #006699;">null</span>; </span> - <span style="color: black;"> ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); </span> - <span style="color: black;"> wifiState = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState(); </span> - <span style="color: black;"> mobileState = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (wifiState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> && mobileState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> </span> - <span style="color: black;"> && State.CONNECTED != wifiState </span> - <span style="color: black;"> && State.CONNECTED == mobileState) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 手机网络连接成功</span> </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">else</span> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (wifiState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> && mobileState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> </span> - <span style="color: black;"> && State.CONNECTED != wifiState </span> - <span style="color: black;"> && State.CONNECTED != mobileState) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 手机没有任何的网络</span> </span> - <span style="color: black;"> } <span class="keyword" style="font-weight: bold; color: #006699;">else</span> <span class="keyword" style="font-weight: bold; color: #006699;">if</span> (wifiState != <span class="keyword" style="font-weight: bold; color: #006699;">null</span> && State.CONNECTED == wifiState) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 无线网络连接成功</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> 在上面这个接收类中OnReceive()方法,你可以在上面三个网络状态(只有手机网络,只有无线网络,没有任何网络)中进行相应的处理,然后在应用中注册广播,注册广播有2种方式,一种在androidmanifest.xml中注册,一种在java代码中注册。 ...

2014年7月4日 · 4 分钟 · 天边的星星

Android使用PhotoView实现图片缩放功能

使用第三方开源项目,地址:https://github.com/chrisbanes/PhotoView 引入library 项目. 简单的加载一张图片: **[java]** [view plain](http://blog.csdn.net/own_1991/article/details/12186627#)[copy](http://blog.csdn.net/own_1991/article/details/12186627#) <div> </div> </div> </div> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">class</span> MainActivity <span class="keyword" style="font-weight: bold; color: #006699;">extends</span> Activity { </span> - <span style="color: black;"> </span> - <span style="color: black;"> ImageView imgView; </span> - <span style="color: black;"> PhotoViewAttacher attacher; </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">protected</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> setContentView(R.layout.activity_main); </span> - <span style="color: black;"> imgView=(ImageView) findViewById(R.id.img); </span> - <span style="color: black;"> imgView.setImageResource(R.drawable.wallpaper); </span> - <span style="color: black;"> attacher=<span class="keyword" style="font-weight: bold; color: #006699;">new</span> PhotoViewAttacher(imgView); </span> - <span style="color: black;"> } </span> - <span style="color: black;">} </span> 布局文件: **[html]** [view plain](http://blog.csdn.net/own_1991/article/details/12186627#)[copy](http://blog.csdn.net/own_1991/article/details/12186627#) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">RelativeLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">xmlns:tools</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/tools&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">tools:context</span>=<span class="attribute-value" style="color: blue;">&#8220;.MainActivity&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: #993300;"><</span><span class="tag-name" style="font-weight: bold; color: #993300;">ImageView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/img&#8221;</span> <span class="tag" style="font-weight: bold; color: #993300;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: #993300;"></</span><span class="tag-name" style="font-weight: bold; color: #993300;">RelativeLayout</span><span class="tag" style="font-weight: bold; color: #993300;">></span> </span>

2014年6月28日 · 2 分钟 · 天边的星星

理解Android的手势识别

对于触摸屏,其原生的消息无非按下、抬起、移动这几种,我们只需要简单重载onTouch或者设置触摸侦听器setOnTouchListener即可进行处理。不过,为了提高我们的APP的用户体验,有时候我们需要识别用户的手势,Android给我们提供的手势识别工具GestureDetector就可以帮上大忙了。 基础 GestureDetector的工作原理是,当我们接收到用户触摸消息时,将这个消息交给GestureDetector去加工,我们通过设置侦听器获得GestureDetector处理后的手势。 GestureDetector提供了两个侦听器接口,OnGestureListener处理单击类消息,OnDoubleTapListener处理双击类消息。 OnGestureListener的接口有这几个: // 单击,触摸屏按下时立刻触发 abstract boolean onDown(MotionEvent e); // 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势) abstract boolean onSingleTapUp(MotionEvent e); // 短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会 abstract void onShowPress(MotionEvent e); // 长按,触摸屏按下后既不抬起也不移动,过一段时间后触发 abstract void onLongPress(MotionEvent e); // 滚动,触摸屏按下后移动 abstract boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY); // 滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势 abstract boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY); OnDoubleTapListener的接口有这几个: // 双击,手指在触摸屏上迅速点击第二下时触发 abstract boolean onDoubleTap(MotionEvent e); // 双击的按下跟抬起各触发一次 abstract boolean onDoubleTapEvent(MotionEvent e); // 单击确认,即很快的按下并抬起,但并不连续点击第二下 abstract boolean onSingleTapConfirmed(MotionEvent e); ...

2014年6月28日 · 2 分钟 · 天边的星星

Android UI开发: 横向ListView(HorizontalListView)及一个简单相册的完整实现 (附源码下载)

本文内容: 1、横向ListView的所有实现思路; 2、其中一个最通用的思路HorizontalListView,并基于横向ListView开发一个简单的相册; 3、实现的横向ListView在点击、浏览时item背景会变色,并解决了listview里setSelected造成item的选择状态混乱的问题。 众所周知,ListView默认的方向是垂直的,但有些时候人们更喜欢横向ListView。纵观整个网络,横向ListView的实现思路如下: 1、在布局里用HorizontalScrollView包含一个ListView,参考这里; 2、利用GridView,把它的行数设为1行; 3、有人继承ListView构造了一个HorizontalScrollListView,参见:这里 4、国外一位大牛继承AdapterView构造的HorizontalListView,这是以上所有方法里本人认为最正统的方法,本文即基于此方法,参见:这里 下面看源码: 这是Activity的布局文件:activity_main.xml **[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">RelativeLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">xmlns:tools</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/tools&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingBottom</span>=<span class="attribute-value" style="color: blue;">&#8220;@dimen/activity_vertical_margin&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingLeft</span>=<span class="attribute-value" style="color: blue;">&#8220;@dimen/activity_horizontal_margin&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingRight</span>=<span class="attribute-value" style="color: blue;">&#8220;@dimen/activity_horizontal_margin&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingTop</span>=<span class="attribute-value" style="color: blue;">&#8220;@dimen/activity_vertical_margin&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">tools:context</span>=<span class="attribute-value" style="color: blue;">&#8220;.MainActivity&#8221;</span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">org.yanzi.ui.HorizontalListView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/horizon_listview&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;150dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_alignParentTop</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">org.yanzi.ui.HorizontalListView</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">ImageView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/image_preview&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_below</span>=<span class="attribute-value" style="color: blue;">&#8220;@id/horizon_listview&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_centerInParent</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:clickable</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:background</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/selector_imageview_background&#8221;</span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="comments" style="color: #008200;"><!&#8211; android:background=&#8221;@android:drawable/ic_menu_gallery&#8221; &#8211;></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">RelativeLayout</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> 这是横向listview的每个item的布局,图片+文字,horizontal_list_item.xml **[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><?</span><span class="tag-name" style="font-weight: bold; color: blue;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">LinearLayout</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingLeft</span>=<span class="attribute-value" style="color: blue;">&#8220;2dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingRight</span>=<span class="attribute-value" style="color: blue;">&#8220;2dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingTop</span>=<span class="attribute-value" style="color: blue;">&#8220;2dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:paddingBottom</span>=<span class="attribute-value" style="color: blue;">&#8220;2dip&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:orientation</span>=<span class="attribute-value" style="color: blue;">&#8220;vertical&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:gravity</span>=<span class="attribute-value" style="color: blue;">&#8220;center&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:clickable</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:background</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/selector_item_background&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">ImageView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/img_list_item&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">TextView</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:id</span>=<span class="attribute-value" style="color: blue;">&#8220;@+id/text_list_item&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_width</span>=<span class="attribute-value" style="color: blue;">&#8220;match_parent&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:layout_height</span>=<span class="attribute-value" style="color: blue;">&#8220;wrap_content&#8221;</span> </span> - <span style="color: black;"> <span class="attribute" style="color: red;">android:gravity</span>=<span class="attribute-value" style="color: blue;">&#8220;center&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">LinearLayout</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> 下面文件是selector_imageview_background.xml,这是大图片你点击浏览时背景发生变化的selector,没有啥实际作用。 **[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><?</span><span class="tag-name" style="font-weight: bold; color: blue;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">selector</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/holo_green_light&#8221;</span> <span class="attribute" style="color: red;">android:state_pressed</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/holo_green_light&#8221;</span> <span class="attribute" style="color: red;">android:state_focused</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@drawable/image_background&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"><span class="comments" style="color: #008200;"><!&#8211; android:drawable=&#8221;@android:color/transparent&#8221; &#8211;></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">selector</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> 下面是每个item的selector,在focus和select时颜色会发生变化:selector_item_background.xml **[html]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span> <span class="attribute" style="color: red;">style</span>=<span class="attribute-value" style="color: blue;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"><?</span><span class="tag-name" style="font-weight: bold; color: blue;">xml</span> <span class="attribute" style="color: red;">version</span>=<span class="attribute-value" style="color: blue;">&#8220;1.0&#8221;</span> <span class="attribute" style="color: red;">encoding</span>=<span class="attribute-value" style="color: blue;">&#8220;utf-8&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">?></span> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">selector</span> <span class="attribute" style="color: red;">xmlns:android</span>=<span class="attribute-value" style="color: blue;">&#8220;http://schemas.android.com/apk/res/android&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/holo_red_light&#8221;</span> <span class="attribute" style="color: red;">android:state_selected</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/holo_green_dark&#8221;</span> <span class="attribute" style="color: red;">android:state_pressed</span>=<span class="attribute-value" style="color: blue;">&#8220;true&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> <span class="tag" style="font-weight: bold; color: blue;"><</span><span class="tag-name" style="font-weight: bold; color: blue;">item</span> <span class="attribute" style="color: red;">android:drawable</span>=<span class="attribute-value" style="color: blue;">&#8220;@android:color/transparent&#8221;</span><span class="tag" style="font-weight: bold; color: blue;">/></span> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">selector</span><span class="tag" style="font-weight: bold; color: blue;">></span><span class="tag" style="font-weight: bold; color: blue;"></</span><span class="tag-name" style="font-weight: bold; color: blue;">span</span><span class="tag" style="font-weight: bold; color: blue;">></span> </span> 主程序:MainActivity.java **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.testhorizontallistview; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.ui.HorizontalListView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.ui.HorizontalListViewAdapter; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.app.Activity; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.os.Bundle; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.Menu; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.AdapterView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.AdapterView.OnItemClickListener; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.ImageView; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> MainActivity <span class="keyword" style="font-weight: bold; color: blue;">extends</span> Activity { </span> - <span style="color: black;"> HorizontalListView hListView; </span> - <span style="color: black;"> HorizontalListViewAdapter hListViewAdapter; </span> - <span style="color: black;"> ImageView previewImg; </span> - <span style="color: black;"> View olderSelectView = <span class="keyword" style="font-weight: bold; color: blue;">null</span>; </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onCreate(Bundle savedInstanceState) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onCreate(savedInstanceState); </span> - <span style="color: black;"> setContentView(R.layout.activity_main); </span> - <span style="color: black;"> initUI(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onCreateOptionsMenu(Menu menu) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// Inflate the menu; this adds items to the action bar if it is present.</span> </span> - <span style="color: black;"> getMenuInflater().inflate(R.menu.main, menu); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> initUI(){ </span> - <span style="color: black;"> hListView = (HorizontalListView)findViewById(R.id.horizon_listview); </span> - <span style="color: black;"> previewImg = (ImageView)findViewById(R.id.image_preview); </span> - <span style="color: black;"> String[] titles = {<span class="string" style="color: red;">&#8220;怀师&#8221;</span>, <span class="string" style="color: red;">&#8220;南怀瑾军校&#8221;</span>, <span class="string" style="color: red;">&#8220;闭关&#8221;</span>, <span class="string" style="color: red;">&#8220;南怀瑾&#8221;</span>, <span class="string" style="color: red;">&#8220;南公庄严照&#8221;</span>, <span class="string" style="color: red;">&#8220;怀师法相&#8221;</span>}; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] ids = {R.drawable.nanhuaijin_miss, R.drawable.nanhuaijin_school, </span> - <span style="color: black;"> R.drawable.nanhuaijin_biguan, R.drawable.nanhuaijin, </span> - <span style="color: black;"> R.drawable.nanhuaijin_zhuangyan, R.drawable.nanhuaijin_faxiang}; </span> - <span style="color: black;"> hListViewAdapter = <span class="keyword" style="font-weight: bold; color: blue;">new</span> HorizontalListViewAdapter(getApplicationContext(),titles,ids); </span> - <span style="color: black;"> hListView.setAdapter(hListViewAdapter); </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// hListView.setOnItemSelectedListener(new OnItemSelectedListener() {</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// @Override</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// public void onItemSelected(AdapterView<?> parent, View view,</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// int position, long id) {</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// // TODO Auto-generated method stub</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// if(olderSelected != null){</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// olderSelected.setSelected(false); //上一个选中的View恢复原背景</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// olderSelected = view;</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// view.setSelected(true);</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// @Override</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// public void onNothingSelected(AdapterView<?> parent) {</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// // TODO Auto-generated method stub</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// </span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// });</span> </span> - <span style="color: black;"> hListView.setOnItemClickListener(<span class="keyword" style="font-weight: bold; color: blue;">new</span> OnItemClickListener() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onItemClick(AdapterView<?> parent, View view, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> position, <span class="keyword" style="font-weight: bold; color: blue;">long</span> id) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// if(olderSelectView == null){</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = view;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// }else{</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView.setSelected(false);</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = null;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = view;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// view.setSelected(true);</span> </span> - <span style="color: black;"> previewImg.setImageResource(ids[position]); </span> - <span style="color: black;"> hListViewAdapter.setSelectIndex(position); </span> - <span style="color: black;"> hListViewAdapter.notifyDataSetChanged(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> - <span style="color: black;"></span> </span> HorizontalListView.java 这就是自定义的横向listview **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.ui; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">/*</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * HorizontalListView.java v1.5</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> *</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * </span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * The MIT License</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * Copyright (c) 2011 Paul Soucy (paul@dev-smart.com)</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * </span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * Permission is hereby granted, free of charge, to any person obtaining a copy</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * of this software and associated documentation files (the &#8220;Software&#8221;), to deal</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * in the Software without restriction, including without limitation the rights</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * copies of the Software, and to permit persons to whom the Software is</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * furnished to do so, subject to the following conditions:</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * </span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * The above copyright notice and this permission notice shall be included in</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * all copies or substantial portions of the Software.</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * </span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * THE SOFTWARE IS PROVIDED &#8220;AS IS&#8221;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * THE SOFTWARE.</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> *</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> */</span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> java.util.LinkedList; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> java.util.Queue; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.content.Context; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.database.DataSetObserver; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Rect; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.util.AttributeSet; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.GestureDetector; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.GestureDetector.OnGestureListener; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.MotionEvent; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.AdapterView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.ListAdapter; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.Scroller; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> HorizontalListView <span class="keyword" style="font-weight: bold; color: blue;">extends</span> AdapterView<ListAdapter> { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> mAlwaysOverrideTouch = <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> ListAdapter mAdapter; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mLeftViewIndex = &#8211;<span class="number" style="color: #c00000;">1</span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mRightViewIndex = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mCurrentX; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mNextX; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mMaxX = Integer.MAX_VALUE; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> mDisplayOffset = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> Scroller mScroller; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> GestureDetector mGesture; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Queue<View> mRemovedViewQueue = <span class="keyword" style="font-weight: bold; color: blue;">new</span> LinkedList<View>(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> OnItemSelectedListener mOnItemSelected; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> OnItemClickListener mOnItemClicked; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> OnItemLongClickListener mOnItemLongClicked; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> mDataChanged = <span class="keyword" style="font-weight: bold; color: blue;">false</span>; </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> HorizontalListView(Context context, AttributeSet attrs) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>(context, attrs); </span> - <span style="color: black;"> initView(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> initView() { </span> - <span style="color: black;"> mLeftViewIndex = &#8211;<span class="number" style="color: #c00000;">1</span>; </span> - <span style="color: black;"> mRightViewIndex = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mDisplayOffset = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mCurrentX = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mNextX = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mMaxX = Integer.MAX_VALUE; </span> - <span style="color: black;"> mScroller = <span class="keyword" style="font-weight: bold; color: blue;">new</span> Scroller(getContext()); </span> - <span style="color: black;"> mGesture = <span class="keyword" style="font-weight: bold; color: blue;">new</span> GestureDetector(getContext(), mOnGesture); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener) { </span> - <span style="color: black;"> mOnItemSelected = listener; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setOnItemClickListener(AdapterView.OnItemClickListener listener){ </span> - <span style="color: black;"> mOnItemClicked = listener; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener) { </span> - <span style="color: black;"> mOnItemLongClicked = listener; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> DataSetObserver mDataObserver = <span class="keyword" style="font-weight: bold; color: blue;">new</span> DataSetObserver() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onChanged() { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span>(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>){ </span> - <span style="color: black;"> mDataChanged = <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> invalidate(); </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onInvalidated() { </span> - <span style="color: black;"> reset(); </span> - <span style="color: black;"> invalidate(); </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> }; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> ListAdapter getAdapter() { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> mAdapter; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> View getSelectedView() { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//TODO: implement</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">null</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setAdapter(ListAdapter adapter) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mAdapter != <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> mAdapter.unregisterDataSetObserver(mDataObserver); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> mAdapter = adapter; </span> - <span style="color: black;"> mAdapter.registerDataSetObserver(mDataObserver); </span> - <span style="color: black;"> reset(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> reset(){ </span> - <span style="color: black;"> initView(); </span> - <span style="color: black;"> removeAllViewsInLayout(); </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setSelection(<span class="keyword" style="font-weight: bold; color: blue;">int</span> position) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//TODO: implement</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> addAndMeasureChild(<span class="keyword" style="font-weight: bold; color: blue;">final</span> View child, <span class="keyword" style="font-weight: bold; color: blue;">int</span> viewPos) { </span> - <span style="color: black;"> LayoutParams params = child.getLayoutParams(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(params == <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> params = <span class="keyword" style="font-weight: bold; color: blue;">new</span> LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> addViewInLayout(child, viewPos, params, <span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> child.measure(MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.AT_MOST), </span> - <span style="color: black;"> MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.AT_MOST)); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onLayout(<span class="keyword" style="font-weight: bold; color: blue;">boolean</span> changed, <span class="keyword" style="font-weight: bold; color: blue;">int</span> left, <span class="keyword" style="font-weight: bold; color: blue;">int</span> top, <span class="keyword" style="font-weight: bold; color: blue;">int</span> right, <span class="keyword" style="font-weight: bold; color: blue;">int</span> bottom) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">super</span>.onLayout(changed, left, top, right, bottom); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mAdapter == <span class="keyword" style="font-weight: bold; color: blue;">null</span>){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mDataChanged){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> oldCurrentX = mCurrentX; </span> - <span style="color: black;"> initView(); </span> - <span style="color: black;"> removeAllViewsInLayout(); </span> - <span style="color: black;"> mNextX = oldCurrentX; </span> - <span style="color: black;"> mDataChanged = <span class="keyword" style="font-weight: bold; color: blue;">false</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mScroller.computeScrollOffset()){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> scrollx = mScroller.getCurrX(); </span> - <span style="color: black;"> mNextX = scrollx; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mNextX <= <span class="number" style="color: #c00000;"></span>){ </span> - <span style="color: black;"> mNextX = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> mScroller.forceFinished(<span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mNextX >= mMaxX) { </span> - <span style="color: black;"> mNextX = mMaxX; </span> - <span style="color: black;"> mScroller.forceFinished(<span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx = mCurrentX &#8211; mNextX; </span> - <span style="color: black;"> </span> - <span style="color: black;"> removeNonVisibleItems(dx); </span> - <span style="color: black;"> fillList(dx); </span> - <span style="color: black;"> positionItems(dx); </span> - <span style="color: black;"> </span> - <span style="color: black;"> mCurrentX = mNextX; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(!mScroller.isFinished()){ </span> - <span style="color: black;"> post(<span class="keyword" style="font-weight: bold; color: blue;">new</span> Runnable(){ </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> run() { </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> fillList(<span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> edge = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> View child = getChildAt(getChildCount()-<span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(child != <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> edge = child.getRight(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> fillListRight(edge, dx); </span> - <span style="color: black;"> </span> - <span style="color: black;"> edge = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> child = getChildAt(<span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(child != <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> edge = child.getLeft(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> fillListLeft(edge, dx); </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> fillListRight(<span class="keyword" style="font-weight: bold; color: blue;">int</span> rightEdge, <span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(rightEdge + dx < getWidth() && mRightViewIndex < mAdapter.getCount()) { </span> - <span style="color: black;"> </span> - <span style="color: black;"> View child = mAdapter.getView(mRightViewIndex, mRemovedViewQueue.poll(), <span class="keyword" style="font-weight: bold; color: blue;">this</span>); </span> - <span style="color: black;"> addAndMeasureChild(child, &#8211;<span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> rightEdge += child.getMeasuredWidth(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mRightViewIndex == mAdapter.getCount()-<span class="number" style="color: #c00000;">1</span>) { </span> - <span style="color: black;"> mMaxX = mCurrentX + rightEdge &#8211; getWidth(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span> (mMaxX < <span class="number" style="color: #c00000;"></span>) { </span> - <span style="color: black;"> mMaxX = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> mRightViewIndex++; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> fillListLeft(<span class="keyword" style="font-weight: bold; color: blue;">int</span> leftEdge, <span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(leftEdge + dx > <span class="number" style="color: #c00000;"></span> && mLeftViewIndex >= <span class="number" style="color: #c00000;"></span>) { </span> - <span style="color: black;"> View child = mAdapter.getView(mLeftViewIndex, mRemovedViewQueue.poll(), <span class="keyword" style="font-weight: bold; color: blue;">this</span>); </span> - <span style="color: black;"> addAndMeasureChild(child, <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> leftEdge -= child.getMeasuredWidth(); </span> - <span style="color: black;"> mLeftViewIndex&#8211;; </span> - <span style="color: black;"> mDisplayOffset -= child.getMeasuredWidth(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> removeNonVisibleItems(<span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> View child = getChildAt(<span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(child != <span class="keyword" style="font-weight: bold; color: blue;">null</span> && child.getRight() + dx <= <span class="number" style="color: #c00000;"></span>) { </span> - <span style="color: black;"> mDisplayOffset += child.getMeasuredWidth(); </span> - <span style="color: black;"> mRemovedViewQueue.offer(child); </span> - <span style="color: black;"> removeViewInLayout(child); </span> - <span style="color: black;"> mLeftViewIndex++; </span> - <span style="color: black;"> child = getChildAt(<span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> child = getChildAt(getChildCount()-<span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(child != <span class="keyword" style="font-weight: bold; color: blue;">null</span> && child.getLeft() + dx >= getWidth()) { </span> - <span style="color: black;"> mRemovedViewQueue.offer(child); </span> - <span style="color: black;"> removeViewInLayout(child); </span> - <span style="color: black;"> mRightViewIndex&#8211;; </span> - <span style="color: black;"> child = getChildAt(getChildCount()-<span class="number" style="color: #c00000;">1</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> positionItems(<span class="keyword" style="font-weight: bold; color: blue;">final</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> dx) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(getChildCount() > <span class="number" style="color: #c00000;"></span>){ </span> - <span style="color: black;"> mDisplayOffset += dx; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> left = mDisplayOffset; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">for</span>(<span class="keyword" style="font-weight: bold; color: blue;">int</span> i=<span class="number" style="color: #c00000;"></span>;i<getChildCount();i++){ </span> - <span style="color: black;"> View child = getChildAt(i); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> childWidth = child.getMeasuredWidth(); </span> - <span style="color: black;"> child.layout(left, <span class="number" style="color: #c00000;"></span>, left + childWidth, child.getMeasuredHeight()); </span> - <span style="color: black;"> left += childWidth + child.getPaddingRight(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> scrollTo(<span class="keyword" style="font-weight: bold; color: blue;">int</span> x) { </span> - <span style="color: black;"> mScroller.startScroll(mNextX, <span class="number" style="color: #c00000;"></span>, x &#8211; mNextX, <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> dispatchTouchEvent(MotionEvent ev) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> handled = <span class="keyword" style="font-weight: bold; color: blue;">super</span>.dispatchTouchEvent(ev); </span> - <span style="color: black;"> handled |= mGesture.onTouchEvent(ev); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> handled; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onFling(MotionEvent e1, MotionEvent e2, <span class="keyword" style="font-weight: bold; color: blue;">float</span> velocityX, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">float</span> velocityY) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span>(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>){ </span> - <span style="color: black;"> mScroller.fling(mNextX, <span class="number" style="color: #c00000;"></span>, (<span class="keyword" style="font-weight: bold; color: blue;">int</span>)-velocityX, <span class="number" style="color: #c00000;"></span>, <span class="number" style="color: #c00000;"></span>, mMaxX, <span class="number" style="color: #c00000;"></span>, <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">protected</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onDown(MotionEvent e) { </span> - <span style="color: black;"> mScroller.forceFinished(<span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> OnGestureListener mOnGesture = <span class="keyword" style="font-weight: bold; color: blue;">new</span> GestureDetector.SimpleOnGestureListener() { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onDown(MotionEvent e) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>.onDown(e); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onFling(MotionEvent e1, MotionEvent e2, <span class="keyword" style="font-weight: bold; color: blue;">float</span> velocityX, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">float</span> velocityY) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>.onFling(e1, e2, velocityX, velocityY); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onScroll(MotionEvent e1, MotionEvent e2, </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">float</span> distanceX, <span class="keyword" style="font-weight: bold; color: blue;">float</span> distanceY) { </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">synchronized</span>(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>){ </span> - <span style="color: black;"> mNextX += (<span class="keyword" style="font-weight: bold; color: blue;">int</span>)distanceX; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> requestLayout(); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> onSingleTapConfirmed(MotionEvent e) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">for</span>(<span class="keyword" style="font-weight: bold; color: blue;">int</span> i=<span class="number" style="color: #c00000;"></span>;i<getChildCount();i++){ </span> - <span style="color: black;"> View child = getChildAt(i); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span> (isEventWithinView(e, child)) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mOnItemClicked != <span class="keyword" style="font-weight: bold; color: blue;">null</span>){ </span> - <span style="color: black;"> mOnItemClicked.onItemClick(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>, child, mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i, mAdapter.getItemId( mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i )); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(mOnItemSelected != <span class="keyword" style="font-weight: bold; color: blue;">null</span>){ </span> - <span style="color: black;"> mOnItemSelected.onItemSelected(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>, child, mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i, mAdapter.getItemId( mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i )); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">break</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> <span class="keyword" style="font-weight: bold; color: blue;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> onLongPress(MotionEvent e) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> childCount = getChildCount(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">for</span> (<span class="keyword" style="font-weight: bold; color: blue;">int</span> i = <span class="number" style="color: #c00000;"></span>; i < childCount; i++) { </span> - <span style="color: black;"> View child = getChildAt(i); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span> (isEventWithinView(e, child)) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span> (mOnItemLongClicked != <span class="keyword" style="font-weight: bold; color: blue;">null</span>) { </span> - <span style="color: black;"> mOnItemLongClicked.onItemLongClick(HorizontalListView.<span class="keyword" style="font-weight: bold; color: blue;">this</span>, child, mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i, mAdapter.getItemId(mLeftViewIndex + <span class="number" style="color: #c00000;">1</span> + i)); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">break</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">boolean</span> isEventWithinView(MotionEvent e, View child) { </span> - <span style="color: black;"> Rect viewRect = <span class="keyword" style="font-weight: bold; color: blue;">new</span> Rect(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] childPosition = <span class="keyword" style="font-weight: bold; color: blue;">new</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[<span class="number" style="color: #c00000;">2</span>]; </span> - <span style="color: black;"> child.getLocationOnScreen(childPosition); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> left = childPosition[<span class="number" style="color: #c00000;"></span>]; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> right = left + child.getWidth(); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> top = childPosition[<span class="number" style="color: #c00000;">1</span>]; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> bottom = top + child.getHeight(); </span> - <span style="color: black;"> viewRect.set(left, top, right, bottom); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> viewRect.contains((<span class="keyword" style="font-weight: bold; color: blue;">int</span>) e.getRawX(), (<span class="keyword" style="font-weight: bold; color: blue;">int</span>) e.getRawY()); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }; </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;"> </span> - <span style="color: black;">} </span> - <span style="color: black;"></span> </span> HorizontalListViewAdapter.java 横向listview的适配器,我将他单独写到一个java文件里。 **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span>><span class="keyword" style="font-weight: bold; color: blue;">package</span> org.yanzi.ui; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.testhorizontallistview.R; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> org.yanzi.util.BitmapUtil; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.content.Context; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.Bitmap; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.graphics.drawable.Drawable; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.media.ThumbnailUtils; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.LayoutInflater; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.View; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.view.ViewGroup; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.BaseAdapter; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.ImageView; </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">import</span> android.widget.TextView; </span> - <span style="color: black;"> </span> - <span style="color: black;"><span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> HorizontalListViewAdapter <span class="keyword" style="font-weight: bold; color: blue;">extends</span> BaseAdapter{ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] mIconIDs; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> String[] mTitles; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Context mContext; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> LayoutInflater mInflater; </span> - <span style="color: black;"> Bitmap iconBitmap; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> selectIndex = &#8211;<span class="number" style="color: #c00000;">1</span>; </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> HorizontalListViewAdapter(Context context, String[] titles, <span class="keyword" style="font-weight: bold; color: blue;">int</span>[] ids){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mContext = context; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mIconIDs = ids; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">this</span>.mTitles = titles; </span> - <span style="color: black;"> mInflater=(LayoutInflater)mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);<span class="comment" style="color: #008200;">//LayoutInflater.from(mContext);</span> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">int</span> getCount() { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> mIconIDs.length; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> Object getItem(<span class="keyword" style="font-weight: bold; color: blue;">int</span> position) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> position; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">long</span> getItemId(<span class="keyword" style="font-weight: bold; color: blue;">int</span> position) { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> position; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> View getView(<span class="keyword" style="font-weight: bold; color: blue;">int</span> position, View convertView, ViewGroup parent) { </span> - <span style="color: black;"> </span> - <span style="color: black;"> ViewHolder holder; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(convertView==<span class="keyword" style="font-weight: bold; color: blue;">null</span>){ </span> - <span style="color: black;"> holder = <span class="keyword" style="font-weight: bold; color: blue;">new</span> ViewHolder(); </span> - <span style="color: black;"> convertView = mInflater.inflate(R.layout.horizontal_list_item, <span class="keyword" style="font-weight: bold; color: blue;">null</span>); </span> - <span style="color: black;"> holder.mImage=(ImageView)convertView.findViewById(R.id.img_list_item); </span> - <span style="color: black;"> holder.mTitle=(TextView)convertView.findViewById(R.id.text_list_item); </span> - <span style="color: black;"> convertView.setTag(holder); </span> - <span style="color: black;"> }<span class="keyword" style="font-weight: bold; color: blue;">else</span>{ </span> - <span style="color: black;"> holder=(ViewHolder)convertView.getTag(); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(position == selectIndex){ </span> - <span style="color: black;"> convertView.setSelected(<span class="keyword" style="font-weight: bold; color: blue;">true</span>); </span> - <span style="color: black;"> }<span class="keyword" style="font-weight: bold; color: blue;">else</span>{ </span> - <span style="color: black;"> convertView.setSelected(<span class="keyword" style="font-weight: bold; color: blue;">false</span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> holder.mTitle.setText(mTitles[position]); </span> - <span style="color: black;"> iconBitmap = getPropThumnail(mIconIDs[position]); </span> - <span style="color: black;"> holder.mImage.setImageBitmap(iconBitmap); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> convertView; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> <span class="keyword" style="font-weight: bold; color: blue;">static</span> <span class="keyword" style="font-weight: bold; color: blue;">class</span> ViewHolder { </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> TextView mTitle ; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> ImageView mImage; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">private</span> Bitmap getPropThumnail(<span class="keyword" style="font-weight: bold; color: blue;">int</span> id){ </span> - <span style="color: black;"> Drawable d = mContext.getResources().getDrawable(id); </span> - <span style="color: black;"> Bitmap b = BitmapUtil.drawableToBitmap(d); </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// Bitmap bb = BitmapUtil.getRoundedCornerBitmap(b, 100);</span> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> w = mContext.getResources().getDimensionPixelOffset(R.dimen.thumnail_default_width); </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">int</span> h = mContext.getResources().getDimensionPixelSize(R.dimen.thumnail_default_height); </span> - <span style="color: black;"> </span> - <span style="color: black;"> Bitmap thumBitmap = ThumbnailUtils.extractThumbnail(b, w, h); </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">return</span> thumBitmap; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">public</span> <span class="keyword" style="font-weight: bold; color: blue;">void</span> setSelectIndex(<span class="keyword" style="font-weight: bold; color: blue;">int</span> i){ </span> - <span style="color: black;"> selectIndex = i; </span> - <span style="color: black;"> } </span> - <span style="color: black;">}</span> </span> 下面是效果图: ![](http://img.blog.csdn.net/20140315182924656?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 下图是一个item被选定后,另一个item获得了焦点: ![](http://img.blog.csdn.net/20140315183047562?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 下面是横向时的截图: ![](http://img.blog.csdn.net/20140315183137906?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveWFuemkxMjI1NjI3/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center) 要点如下: 1、可以说这个HorizontalListView是完美的,但美中不足的并不是其他人说的不能点击、晃动、加载不全的问题,而是这个横向Listview的高度,如果你设成wrap_cotent那么将会占据整个屏幕,**即使你将它适配器里的view的高度限制死,限制成很小,这个HorizontalListView的高度依然是全屏**。本文代码里,我把图片缩略图弄成100dip,所以把这个HorizontalListView的高度设为了150dip。 2、在适配器里,我填充了一个图片,下面是文字。为了能让浏览图片时item有反应,搞了一个selector,它的用法详见[这里](http://blog.csdn.net/shakespeare001/article/details/7788400). 但一开始在点击时完全没有反应,参考这里: [http://blog.csdn.net/ljz2009y/article/details/18820071](http://blog.csdn.net/ljz2009y/article/details/18820071) 为此我的selector如下: <?xml version=”1.0″ encoding=”utf-8″?> 将自然状态下的背景放到了最后,但点击浏览时依然没有作用。**其实最根本原因是在布局文件里horizontal_list_item.xml要让这个布局能够clickable,即:android:clickable=”true”** 3、上一步完成了,还需要点击即select一个item时,让它变色并且保持住,然后点击另外一个item时,让之前得item恢复默认背景。为了实现这个问题,我曾作如下尝试: **[java]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[copy](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[print](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[?](http://blog.csdn.net/yanzi1225627/article/details/21294553#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/237690)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/237690/fork) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family: &#8216;Comic Sans MS&#8217;; font-size: 18px;&#8221;</span>><span class="comment" style="color: #008200;">// if(olderSelectView == null){</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = view;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// }else{</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView.setSelected(false);</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = null;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// }</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// olderSelectView = view;</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;">// view.setSelected(true);</span></span> </span> 即在click监听里,保存上一个选中的view。遗憾的是这种方法会造成item的选中状态造成混乱,比如第一个item选中了,同时第5个item也莫名其妙的被选中了。上述情况发生在滑动时,即一屏显示不完的情况下。当我横屏时,在所有的item都能一次性显示出来情况下,用上述方法么问题。后来我想到,这可以是适配器里的缓存机制造成的,**<span style="color: #ff0000;">最好不要再listview适配器外对item作修改,即便修改则一定要调适配器的: hListViewAdapter.notifyDataSetChanged();通知刷新view,毕竟适配器才是view的提供者</span>**。参考这位大大的文章:[http://longyi-java.iteye.com/blog/976067](http://longyi-java.iteye.com/blog/976067) 在适配器里加了一个接口保存选中的索引,然后再getView函数里进行判断。如果是选中的item,则将布局设为选中状态即可,horizontal_list_item.xml里的Linearlayout就会自动加载那个selector了。而无需像这个参考链接里对每个item的元素分别设置状态。</div> <div> 4、BitmapUtil是个工具类,负责将id转成一个bitmap,然后用android自带的ThumbnailUtils去提取缩略图。 </div> <div> 5、之所以horizontal_list_item布局里要设置padding是为了选中item时,整个item有种被圈住的感觉,而不是光下面一点变色。 </div> <div> 源码下载:[http://download.csdn.net/detail/yanzi1225627/7046295](http://download.csdn.net/detail/yanzi1225627/7046295)</div> <div> 欢迎Android爱好者加群 <div id="group_name" class="group_name usrInputFont"> <span class="qname" title="Android您问我讲-2">**Android您问我讲-2,**</span> </div> **群号:**<span id="group_number" class="group_number">**19241311,备注:yanzi**</span> </div> <div> </div> <div> &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;本文系原创,转载请注明作者:yanzi1225627 </div> <div> </div> <div> </div> <div> 源码下载:[http://download.csdn.net/detail/yanzi1225627/7046295](http://download.csdn.net/detail/yanzi1225627/7046295) </div> <div> 源码下载:[http://download.csdn.net/detail/yanzi1225627/7046295](http://download.csdn.net/detail/yanzi1225627/7046295) </div>

2014年6月27日 · 37 分钟 · 天边的星星

Android代码实现长按显示波纹外扩动画

项目两张图片: wave btn 代码: package com.example.waveanimation; import Android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.animation.AlphaAnimation; import android.view.animation.AnimationSet; import android.view.animation.ScaleAnimation; import android.widget.ImageView; public class MainActivity extends Activity { private static final int ANIMATIONEACHOFFSET = 600; // 每个动画的播放时间间隔 private AnimationSet aniSet, aniSet2, aniSet3; private ImageView btn, wave1, wave2, wave3; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (msg.what == 0x222) { wave2.startAnimation(aniSet2); } else if (msg.what == 0x333) { wave3.startAnimation(aniSet3); } super.handleMessage(msg); } ...

2014年6月27日 · 2 分钟 · 天边的星星