首页 文章 精选 留言 我的

精选列表

搜索[网站开发],共10000篇文章
优秀的个人博客,低调大师

【Android UI设计与开发】10:滑动菜单栏(二)SlidingMenu 动画效果的实现

其实就是在显示菜单栏时,有个动画的效果。代码比较简单,下面进行说明。 1.效果图如下,手机上查看效果更佳 2.代码实现,这里只讲解动画效果的实现,具体代码可在源代码中查看 <1> 先定义一个CanvasTransformer接口对象,这个接口是在slidingmenu_library类库中封装好的 private CanvasTransformer mTransformer; <2> 然后再实例化此接口,重写接口中的方法,例如示例1中的方法: /** * transformCanvas(Canvas canvas, float percentOpen) * ① Canvas canvas:画布类; * ② float percentOpen:滑动菜单栏打开时的百分比值。 */ mTransformer = new CanvasTransformer() { @Override public void transformCanvas(Canvas canvas, float percentOpen) { float scale = (float) (percentOpen * 0.25 + 0.75); canvas.scale(scale, scale, canvas.getWidth() / 2, canvas.getHeight() / 2); } }; <3> 最后在把实例化的接口对象赋给SlidingMenu类中的setBehindCanvasTransformer()方法: getSlidingMenu().setBehindCanvasTransformer(mTransformer); <4>这样就完成了动画效果的实现,下面是示例1的主界面代码,其他的有兴趣的朋友可以查看源代码 package com.yanis.anima; import android.graphics.Canvas; import android.os.Bundle; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu; import com.jeremyfeinstein.slidingmenu.lib.SlidingMenu.CanvasTransformer; import com.jeremyfeinstein.slidingmenu.lib.app.SlidingFragmentActivity; /** * * @author Yanis * @Description 滑动时缩放的效果 */ public class FirstActivity extends SlidingFragmentActivity { private CanvasTransformer mTransformer; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); initAnimation(); initSlidingMenu(); getActionBar().setDisplayHomeAsUpEnabled(true); } /** * 初始化滑动菜单 */ private void initSlidingMenu() { // 设置主界面视图 setContentView(R.layout.layout_right); // 设置滑动菜单视图 setBehindContentView(R.layout.layout_left); // 设置滑动菜单的属性值 SlidingMenu sm = getSlidingMenu(); // 根据dimension资源文件的ID来设置下方视图的偏移量,此处是220dp sm.setBehindOffsetRes(R.dimen.slidingmenu_offset); sm.setFadeDegree(0.35f); sm.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN); sm.setBehindScrollScale(0.0f); sm.setBehindCanvasTransformer(mTransformer); setSlidingActionBarEnabled(true); } /** * 初始化动画效果 */ private void initAnimation() { /** * transformCanvas(Canvas canvas, float percentOpen) * ① Canvas canvas:画布类; * ② float percentOpen:滑动菜单栏打开时的百分比值。 */ mTransformer = new CanvasTransformer() { @Override public void transformCanvas(Canvas canvas, float percentOpen) { float scale = (float) (percentOpen * 0.25 + 0.75); canvas.scale(scale, scale, canvas.getWidth() / 2, canvas.getHeight() / 2); } }; } } 本文转自叶超Luka博客园博客,原文链接:http://www.cnblogs.com/yc-755909659/p/4311173.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

[Android学习笔记三] Support v7提供交错式网格布局开发示例

本文主要介绍Android Support v7提供的RecycleView和交错式布局(通常成为瀑布流布局)的使用和事件监听处理。 1. 涉及到开源库有: Fresco: Facebook开源的不是一般强大的图片加载组件库 Bufferknife: Android View和事件绑定库,通过注解完成,在编译时APT处理注解文档。 2. 模块配置 Android Studio模块,build.gradle配置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 applyplugin: 'com.android.application' android{ compileSdkVersion 21 buildToolsVersion '21.1.2' defaultConfig{ applicationId 'secondriver.sdk' minSdkVersion 16 targetSdkVersion 21 versionCode 1 versionName '1.0' } buildTypes{ release{ minifyEnabledfalse proguardFilesgetDefaultProguardFile( 'proguard-android.txt' ), 'proguard-rules.pro' } } packagingOptions{ exclude 'META-INF/services/javax.annotation.processing.Processor' } lintOptions{ disable 'InvalidPackage' } } dependencies{ compilefileTree(dir: 'libs' ,include:[ '*.jar' ]) compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.android.support:recyclerview-v7:21.0.3@aar' compile 'com.android.support:cardview-v7:21.0.3@aar' compile 'com.facebook.fresco:fresco:0.8.0' compile 'com.jakewharton:butterknife:7.0.1' testCompile 'junit:junit:4.12' } 3. 布局文件 主布局文件:activity_recycleview.xml 包含一个RecycleView,将作为主屏幕组件。 1 2 3 4 5 6 7 8 9 10 11 12 13 <? xml version = "1.0" encoding = "utf-8" ?> < RelativeLayout android:id = "@+id/swipe_refresh_layout" xmlns:android = "http://schemas.android.com/apk/res/android" android:layout_width = "match_parent" android:layout_height = "wrap_content" > < android.support.v7.widget.RecyclerView android:id = "@+id/recycler_view" android:layout_width = "match_parent" android:layout_height = "wrap_content" android:layout_alignParentTop = "true" android:scrollbars = "vertical" /> </ RelativeLayout > RecycleView 通过设置不同的布局管理器对象来实现不同的布局显示,如: android.support.v7.widget.LinearLayoutManager 可以实现ListView的布局效果 android.support.v7.widget.GridLayoutManager 可以实现GridView的布局效果 android.support.v7.widget.StaggeredGridLayoutManager 可以实现交错式网格布局效果 次布局文件(RecycleView中显示的每一项视图的布局):item_recycelview.xml 通过com.android.support:CardView包提供的CardView帧式容器布局包含一个ImageView和TextView作为RecycleView的每一项视图的布局。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 <? xml version = "1.0" encoding = "utf-8" ?> < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:card_view = "http://schemas.android.com/apk/res-auto" xmlns:fresco = "http://schemas.android.com/tools" android:layout_width = "match_parent" android:layout_height = "match_parent" android:gravity = "center" > < android.support.v7.widget.CardView android:id = "@+id/card_view" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_gravity = "center" card_view:cardCornerRadius = "4dp" card_view:cardUseCompatPadding = "true" > < RelativeLayout android:layout_width = "match_parent" android:layout_height = "wrap_content" android:orientation = "vertical" > < com.facebook.drawee.view.SimpleDraweeView android:id = "@+id/info_image" android:layout_width = "300dp" android:layout_height = "420dp" fresco:actualImageScaleType = "centerCrop" fresco:placeholderImage = "@mipmap/ic_launcher" fresco:roundAsCircle = "false" fresco:roundBottomLeft = "true" fresco:roundBottomRight = "true" fresco:roundTopLeft = "true" fresco:roundTopRight = "true" fresco:roundedCornerRadius = "1dp" fresco:roundingBorderWidth = "2dp" /> < TextView android:id = "@+id/info_text" android:layout_width = "200dp" android:layout_height = "80dp" android:textSize = "20sp" android:textColor = "@android:color/holo_blue_dark" android:textAppearance = "?android:attr/textAppearanceMedium" android:layout_alignLeft = "@id/info_image" android:layout_alignRight = "@id/info_image" android:layout_below = "@id/info_image" android:gravity = "left|center_vertical" /> </ RelativeLayout > </ android.support.v7.widget.CardView > </ LinearLayout > ImageView组件使用的是Fresco库提供的视图组件。 4. Activity实现和数据填充 4.1 RecycleView中的每一项视图的数据组成 文本信息+ 图片地址(url,file,resId) 本示例中采用Url网络图片 1 2 3 4 5 6 7 8 9 10 11 12 /** *View项的数据对象 */ static class Pair{ public Stringtext; public Stringurl; public Pair(Stringtext,Stringurl){ this .text=text; this .url=url; } } 4.2 RecycleView中国的每一项视图的数据填充,即适配器 自定义适配器需要实现RecycleView.Adapter类。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 static class RecycleViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{ /** *RecycleView的View项单击事件监听 */ public interface OnRecycleViewItemClickListener{ void onRecycleViewItemClick(Viewview, int position); } private ArrayList<Pair>items= new ArrayList<>(); private OnRecycleViewItemClickListenermOnRecycleViewItemClickListener; public RecycleViewAdapter(ArrayList<Pair>items){ this .items=items; } @Override public RecyclerView.ViewHolderonCreateViewHolder(ViewGroupparent, int viewType){ Viewview=LayoutInflater.from(parent.getContext()).inflate(R.layout.item_recyclerview,parent, false ); return new RecycleViewItemHolder(view,mOnRecycleViewItemClickListener); } @Override public void onBindViewHolder(RecyclerView.ViewHolderholder, int position){ Pairpair=items.get(position); ((RecycleViewItemHolder)holder).setContent(pair); } @Override public int getItemCount(){ return items.size(); } public void setOnRecycleViewItemClickListener(OnRecycleViewItemClickListeneronItemClickListener){ if ( null !=onItemClickListener){ this .mOnRecycleViewItemClickListener=onItemClickListener; } } } 主要实现onCreateViewHolder和onBindViewHolder方法。由于RecycleView并未提供为视图项添加监听事件,这里自定义个一个事件监听接口,在实例化适配器的时候可以选择设置事件监听。 4.3 创建ViewHolder需要通过自定义ViewHolder类继承RecycleView.ViewHolder。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 static class RecycleViewItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ @Bind (R.id.info_text) public TextViewinfoTextView; @Bind (R.id.info_image) public SimpleDraweeViewdraweeView; private RecycleViewAdapter.OnRecycleViewItemClickListeneronItemClickListener; public RecycleViewItemHolder(ViewitemView,RecycleViewAdapter.OnRecycleViewItemClickListeneronItemClickListener){ super (itemView); ButterKnife.bind( this ,itemView); this .onItemClickListener=onItemClickListener; itemView.setOnClickListener( this ); } public void setContent(Pairpair){ infoTextView.setText(pair.text); draweeView.setImageURI(Uri.parse(pair.url)); } @Override public void onClick(Viewv){ if ( null !=onItemClickListener){ onItemClickListener.onRecycleViewItemClick(v,getPosition()); } } } 在构造方法中的传入OnRecycleViewItemClickListener对象,并且自定义ViewHolder实现OnClickListener接口,通过为itemView对象设置OnClickListener监听事件,在onClick方法中将点击事件的处理交由OnRecycleViewItemClickListener对象处理,从而达到为RecycleView中的itemView注册点击事件。 如果不采用这种方式添加事件监听,就不需要自定义监听接口和自定义ViewHolder实现事件监听接口以及事件处理。另外可以通过获得的itemView之后,通过组件I的获取组件来添加事件监听。还可以通过获得的自定义ViewHolder,来访问每个组件。 4.4 Activity的具体实现 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 package secondriver.sdk.activity; import android.app.Activity; import android.net.Uri; import android.os.Bundle; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import android.widget.Toast; import com.facebook.drawee.view.SimpleDraweeView; import java.util.ArrayList; import java.util.Arrays; import java.util.Random; import butterknife.Bind; import butterknife.ButterKnife; import secondriver.sdk.R; /** *Author:secondriver *Created:2015/11/18 */ public class RecycleViewActivity extends Activity{ private static final StringTAG=RecyclerView. class .getName(); private static final String[]RES_URL= new String[]{ "http://p1.wmpic.me/article/2015/11/16/1447644849_hySANEEF.jpg" , //减少篇幅,此处省去14个图片Url }; @Bind (R.id.recycler_view) public RecyclerViewmRecycleView; private final int PRE_SCREEN_NUMBER= 6 ; private final int SPAN_COUNT= 2 ; private int previousLastIndex= 0 ; private boolean isSlidingToLast= false ; private RecycleViewAdaptermAdapter; private ArrayList<Pair>mItem= new ArrayList<>(); //交错式网格布局管理对象,即通常称的瀑布流布局 private StaggeredGridLayoutManagermLayoutManager; @Override protected void onCreate(BundlesavedInstanceState){ super .onCreate(savedInstanceState); setContentView(R.layout.activity_recyclerview); ButterKnife.bind( this ); Fresco.initialize( this ); //重要,Fresco做一系列初始化工作 initRecycleView(); } private void initRecycleView(){ mLayoutManager= new StaggeredGridLayoutManager(SPAN_COUNT,StaggeredGridLayoutManager.VERTICAL); mRecycleView.setLayoutManager(mLayoutManager); mAdapter= new RecycleViewAdapter(mItem); loadData( false ); mRecycleView.setAdapter(mAdapter); mRecycleView.setItemAnimator( new DefaultItemAnimator()); //RecycleView的View项单击事件监听 mAdapter.setOnRecycleViewItemClickListener( new RecycleViewAdapter.OnRecycleViewItemClickListener(){ @Override public void onRecycleViewItemClick(Viewview, int position){ long id=mRecycleView.getChildItemId(view); Log.d(TAG, "View项的根视图:" +view.getClass().getName()+ ",position=" +position+ "ViewHolder_Id=" +id); //通过findViewById查找View项中的元素 SimpleDraweeViewdraweeView=(SimpleDraweeView)view.findViewById(R.id.info_image); if ( null !=draweeView){ draweeView.setImageURI(Uri.parse(RES_URL[ 0 ])); Toast.makeText(RecycleViewActivity. this , "通过findViewById查找View项中的元素" ,Toast.LENGTH_LONG).show(); } RecycleViewItemHolderrecycleViewItemHolder=(RecycleViewItemHolder)mRecycleView.findViewHolderForPosition(position); if ( null !=recycleViewItemHolder){ recycleViewItemHolder.infoTextView.setText( "通过ViewHolder找到View项中的元素" ); } } }); //下拉刷新,追加内容 mRecycleView.setOnScrollListener( new RecyclerView.OnScrollListener(){ @Override public void onScrollStateChanged(RecyclerViewrecyclerView, int newState){ super .onScrollStateChanged(recyclerView,newState); if (newState==RecyclerView.SCROLL_STATE_IDLE){ if (isPullToBottom()&&isSlidingToLast){ if (mItem.size()> 36 ){ //最大数据量 Toast.makeText(RecycleViewActivity. this , "没有数据了" ,Toast.LENGTH_LONG).show(); return ; } else { loadData( false ); Log.d(TAG, "notifyItemRangeInsertedstartPosition=" +previousLastIndex); mAdapter.notifyItemRangeInserted(previousLastIndex,PRE_SCREEN_NUMBER); } } } if (newState==RecyclerView.SCROLL_STATE_SETTLING){ Log.d(TAG, "settling" ); } } @Override public void onScrolled(RecyclerViewrecyclerView, int dx, int dy){ super .onScrolled(recyclerView,dx,dy); isSlidingToLast=dy> 0 ; //上拉,下滑 Log.d(TAG, "dx=" +dx+ "dy=" +dy+ "isSlidingToLast=" +isSlidingToLast); } } ); } private boolean isPullToBottom(){ int []lastIndexs=mLayoutManager.findLastCompletelyVisibleItemPositions( null ); Log.d(TAG, "lastitem=" +Arrays.toString(lastIndexs)+ ",haveitem=" +mAdapter.getItemCount()); int maxIndex=mAdapter.getItemCount()- 1 ; for ( int i:lastIndexs){ if (i==maxIndex){ return true ; } } return false ; } private void loadData( boolean isClear){ if (isClear){ mItem.clear(); } previousLastIndex=mItem.size(); Randomr= new Random(); for ( int index= 0 ;index<PRE_SCREEN_NUMBER&&index<RES_URL.length;index++){ mItem.add( new Pair( "Card" +(previousLastIndex+index),RES_URL[r.nextInt(RES_URL.length)])); } Log.d(TAG, "mItemcount=" +mItem.size()); } } 说明: RecycleView的ItemView的数据由Pair对象管理存储 Fresco库默认配置下的使用之前需要初始化调用Fresco.initialize(Context) 上述实现了2个事件监听,一个OnScrollerListener由RecycleView提供,实现下拉刷新;一个OnRecycleViewItemClickListener由自定义的RecycleViewAdpater提供,实现单击itemView来更换图片(SimpleDraweeView)和文字(TextView)。 Butterknife和Fresco库的具体使用参见其Github上的文档。 5. 效果图 比较遗憾ScreenRecord不支持模拟器和Android4.4一下的系统,只能附上截图。 本文转自 secondriver 51CTO博客,原文链接:http://blog.51cto.com/aiilive/1715139,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android GIS开发系列-- 入门季(7) 利用GeometryEngine坐标转换、计算距离与面积等

GeometryEngine是Arcgis的重要工具类,利用此工具类,可以计算地图上的距离、面积,将点、线、面转化为Json数据,将Json转化为点线面,坐标转换作用非常强大。 一、坐标转化 将用到方法 GeometryEngine.project(Geometry geometry, SpatialReference inputSR, SpatialReference outputSR),第二个为Geometry的坐标,第三个参数为要转换的坐标。如果将84坐标转换为墨卡托坐标代码如下: Point point1 = new Point(113,23); Point point2 =(Point)GeometryEngine.project(point1,SpatialReference.create(SpatialReference.WKID_WGS84), SpatialReference.create(SpatialReference.WKID_WGS84_WEB_MERCATOR)); 二、GeometryEngine计算两点的距离 用到 GeometryEngine.geodesicDistance(Geometry geometry1, Geometry geometry2, SpatialReference spatialReference, LinearUnit distanceUnit)方法。注意最好不要用GeometryEngine.distance方法,此方法是计算2D长度的,计算不准确。代码如下: Point point1 = new Point(113,23); Point point2 = new Point(113,24); double distance = GeometryEngine.geodesicDistance(point3,point4, SpatialReference.create(SpatialReference.WKID_WGS84), new LinearUnit(LinearUnit.Code.KILOMETER)); Log.i("TAG","distance ==="+distance );此外, 通过GeometryEngine.geodesicArea, GeometryEngine.geodesicLength可分别计算处面积和周长,大家去探索去。我有不想再列举了。 没有整理与归纳的知识,一文不值!高度概括与梳理的知识,才是自己真正的知识与技能。 永远不要让自己的自由、好奇、充满创造力的想法被现实的框架所束缚,让创造力自由成长吧! 多花时间,关心他(她)人,正如别人所关心你的。理想的腾飞与实现,没有别人的支持与帮助,是万万不能的。 本文转自wenglabs博客园博客,原文链接:http://www.cnblogs.com/arxive/p/7751954.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

【Android游戏开发之六】在SurfaceView中添加组件!!!!并且相互交互数据!!!!

各位童鞋请你们注意:surfaceview中确实有 onDraw这个方法,但是surfaceview不会自己去调用!!! 而我代码中的ondraw 也好 draw 也好,都是我自己定义的一个方法。。。放在线程中不断调用的,一定要注意!! 昨天圣诞节,没有出去,而是一天时间全部纠结在如何在SurfaceView中添加组件,例如添加常用的Button,TextView等等、一开始也想着从网上找些资料看看有没有可参考的,但是发现搜到的结果仍是些童鞋对此很疑惑并且也在找寻答案,那么,这里就把圣诞节一天的成果来和各位童鞋分享; 1.因为我们的SurfaceView是个View对于添加的组件其实也是View,如果我们只是一味的想在SurfaceView中添加View组件其实是错误的思想,当然我一开始也是想着直接在SurfaceView中定义或者去使用组件,但是结果肯定是不成功的,因为View不能添加View! 2.既然第一条肯定是错误的,那么我们就应该想到把我们的SurfaceView和组件都放在一个Layout里面,毕竟我们的的SurfaceView也是一个view和其他组件一同放在我们的layout里,那么这样一来肯定就能完成在SurfaceView中添加组件的目的啦。下面先上截图 大家看到中间白色区域就是我们的SurfaceView啦,最上方是组件TextView ,最下方是Button 、对的,要的就是这个效果!而不是像前面文章中多个Activity切换,这样都在一个界面中啦。哇哈哈啊。好、下面来看代码吧: 先放上Xml 代码: <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"> <TextView android:id="@+id/textview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="ThisisHimi" android:textSize="32sp" android:textColor="#00FF00" android:gravity="center_horizontal"/> </LinearLayout> <FrameLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1"> <com.himi.MySurfaceViewandroid:id="@+id/view3d" android:layout_width="fill_parent" android:layout_height="fill_parent"/> </FrameLayout> <LinearLayout android:orientation="horizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="HimiButton_1" android:id="@+id/button1"/> <Buttonandroid:layout_width="wrap_content" android:layout_height="wrap_content" android:text="HimiButton_2" android:id="@+id/button2"/> </LinearLayout> </LinearLayout> 以上代码很简单,都是一些布局方式和各个组件一些属性及显示方式的设定,当然主要看如何对我们的SurfaceView如何注册在xml中的,那么每个组件都有id这样为了对后面其交互数据用到,因为我们要对每个组件操作,所以这里都索引了id方面从R文件中取出其对象。 那么,xml我们定义好了,看看代码中如何实现的,这里先说下Activity类中代码: packagecom.himi; importandroid.app.Activity; importandroid.os.Bundle; importandroid.view.View; importandroid.view.Window; importandroid.view.WindowManager; importandroid.view.View.OnClickListener; importandroid.widget.Button; importandroid.widget.TextView; publicclassMainActivityextendsActivityimplementsOnClickListener{ /**Calledwhentheactivityisfirstcreated.*/ privateButtonbutton1,button2; privateTextViewtv; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐去标题(应用的名字) //此设定必须要写在setContentView之前,否则会有异常) this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); setContentView(R.layout.main);//要先显示,然后再对其组件取出、处理操作 tv=(TextView)findViewById(R.id.textview); button1=(Button)findViewById(R.id.button1); button1.setOnClickListener(this);//这里是监听按键,因为本类使用了OnClickListener接口 button2=(Button)findViewById(R.id.button2); button2.setOnClickListener(this); /*其实大家也可以不用本类使用接口,可以内部类来完成。 *以下是不使用OnClickListener接口的绑定监听方式; button2.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ //这里处理按键操作 } }); */ } @Override publicvoidonClick(Viewv){ if(v==button1){ MySurfaceView.button_str="button1被触发"; tv.setText("button1被触发"); }elseif(v==button2){ MySurfaceView.button_str="button2被触发"; tv.setText("button2被触发"); } } } 该有的备注在代码后面都备注了,MySurfaceView.button_str,这个是自己的SurfaceView中定义的一个static 的变量用来交互数据用到;在那么下面就要看我们的SurfaceView,当在Xml注册需要注意什么了,我半天的时候都花在了这里!!!一定要引起注意,这也是在SurfaceView中并显示组件完成最重要的一步。 先分析: 1.SurfaceView类的创建和实现等等和之前都是一样的,该怎么去写还怎么去写,但是!构造函数一定要注意! /* *publicMySurfaceView(Contextcontext){super(context);}//备注1(这里一定要引起注意,仔细看下文对备注1的解释) */ publicMySurfaceView(Contextcontext,AttributeSetattrs){//备注1} 这里解释下备注1: 这里有两个构造函数,当然我们用哪个都是可以的,但是在此时我们需要明确我们到底要使用哪个。 一个参数的构造函数:如果是new出来的此类实例肯定是没有问题,但是我们为了能在显示SurfaceView同时显示别的组件,所以把自定义的SurfaceView也当作组件注册在了main——xml中,所以这里需要注意,当在xml中注册的就必须在SurfaceView中使用这种含有两个参数的构造函数的方法, xml初始化的时候会调用两个参数的这个构造方法, (当时这个问题困扰了半天的研究时间,最后在一个群友的帮助下才发现是这里出了问题) 那么含有两个构造参数的方法里第二个参数指的自定义的组件的一些属性,就像长宽一样,你可以给组件属性,就是通过这个来传递的! 那么在SurfaceView 中并一同显示组件也就到底完结了,回顾下,一共分为3步,1.将我们的SurfaceView 作为一个组件view 和其他组件一同放置到布局中,当然布局的方式和显示的方式大家自己随自己喜欢定义! 2.在我们的SurfaceView中一定要使用两个构造函数的构造函数,一定!一定! 就这里有区别,别的还是该怎么处理就怎么处理,就是构造函数换了 3.交互数据,对其按键的绑定在 activity中完成,别把view绑定在咱们的SurfaceView中啊,否则报错- -、 这里说下为什么要在activity中去绑定按键处理 而不是在我们的surfaceview中去绑定: 其实根据xml中定义button时的id 我们可以通过R.id 索引取到button,不管在activity中还是我们的surfaceview中都可以取到,但是!绑定button这一步如果在 surfaceview中去写就一定报错,原因我解释下; 我们在xml中定义我们的surfaceview 和 组件button、textview等等的时候 他们是同一级别的!!而不是把button包含在 surfaceview里,所以虽然在surfaceview中可以根据id索引到button但绑定的时候是无法找到button的,只有我们的activitysetContentView(R.layout.main); 显示的button,所以只能在显示它的activity中去绑定,这里需要注意下; 下面分享出源码: 源码下载地址:http://www.himigame.com/android-game/306.html 本文转自 xiaominghimi 51CTO博客,原文链接:http://blog.51cto.com/xiaominghimi/605740,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android UI开发第二十一篇——下拉刷新列表实现(pull to refresh)

android中提供了ListView控件,listview能够为我们展现丰富的内容,有时候我们为了提升用户体检,需要更炫而且更好用户体验的效果,pull to refresh(下拉刷新列表效果)就应运而生了。 pull to refresh更多的应用于获取最新的内容,比如新浪微博、腾讯微博等。目前网上有很多开源的pull to refresh的开源实现,这里也是参考开源代码实现的。 Layout <!-- The PullToRefreshListView replaces a standard ListView widget. --> <com.markupartist.android.widget.PullToRefreshListView android:id="@+id/android:list" android:layout_height="fill_parent" android:layout_width="fill_parent" /> Activity // Set a listener to be invoked when the list should be refreshed. ((PullToRefreshListView) getListView()).setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { // Do work to refresh the list here. new GetDataTask().execute(); } }); private class GetDataTask extends AsyncTask<Void, Void, String[]> { ... @Override protected void onPostExecute(String[] result) { mListItems.addFirst("Added after refresh..."); // Call onRefreshComplete when the list has been refreshed. ((PullToRefreshListView) getListView()).onRefreshComplete(); super.onPostExecute(result); } } 源码下载:http://download.csdn.net/detail/xyz_lmn/4676611 参考: https://github.com/johannilsson/android-pulltorefresh https://github.com/fanfoudroid/fanfoudroid http://www.eoeandroid.com/thread-190295-1-1.html http://k-beta.com/android-listview-more-refresh.html 本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/1230769,如需转载请自行联系原作者

优秀的个人博客,低调大师

Java微服务开发指南 -- 使用Docker和Kubernetes构建可伸缩的微服务

使用Docker和Kubernetes构建可伸缩的微服务 从现在开始,我们将从更高的维度讨论微服务,涵盖了组织敏捷性、设计和依赖的思考、领域驱动设计以及Promise理论。当我们深入使用之前介绍的三个流行的微服务框架:Spring Boot、Dropwizard和WildFly Swarm,我们能够使用它们开箱即用的能力去构建一个暴露或者消费REST服务的应用,能够使用外部环境对应用进行配置,可以打包成一个可执行的jar,同时提供Metrics信息,但这些都是围绕着一个微服务实例。当我们需要管理微服务之间的依赖、集群的启动和关闭、健康检查以及负载均衡的时候,我们使用微服务架构会面临什么问题呢?本章,我们将讨论这些高阶话题用来理解部署微服务时面对的挑战。 当我们开始将我们的应用和服务按照微服务的思路进行拆分后,我们将面临

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册