2023年7月13日发(作者:)
android页⾯布局代码实现⽅法,【Android】纯代码建⽴页⾯布局(含异步加载图⽚)...开发环境:macOS 10.12 + Android Studio 2.2,MinSDK Android 5.1java先看看整体效果android本⽰例是基于Fragment进⾏的,直接上代码:缓存【界⾯结构】⽹络在 Fragment 中,采⽤ ScrollView + LinearLayout 实现。app12 xmlns:tools="/tools"3 android:layout_width="match_parent"4 android:layout_height="match_parent"5 android:scrollbars="vertical"6 tools:context=".g">79 android:layout_width="match_parent"10 android:layout_height="match_parent"11 android:orientation="vertical"12 android:divider="@drawable/sep_home"13 android:showDividers="middle" />14顺便说⼀句,显⽰列表中的分割线,采⽤⾃⾝的divider来实现,实现⽅式见上述代码中的第⼗⼆、13⾏。异步分割线采⽤ drawable 的 shape,注意:shape 中必定要添加 solid 和 size,⽽且 solid 的颜⾊必须定义,哪怕是透明的也要定义。ide项⽬结构以下:布局背景颜⾊的定义,在 values/colors 中实现,以下所⽰:post1 #EEEEEE整个 divider 的代码以下:测试1 2345【代码结构】新建 java 的类库,名为:,主要是结合缓存实现图⽚的异步加载(线程池⽅式),代码以下:1 le;2 r;34 ference;5 ;6 p;7 ;orService;9 ors;1011 public classTestImage {12 //为了加快速度,在内存中开启缓存13 //主要应⽤于重复图⽚较多时,或者同⼀个图⽚要屡次被访问,好⽐在ListView时来回滚动14 public Map> imageCache = new HashMap>();1516 //固定 10 个线程来执⾏任务17 private ExecutorService _exeService = edThreadPool(10);18 private final Handler _handler =newHandler();1920 public Drawable getImage(final String url, finalCallback callback) {2122 //缓存中存在就⽤缓存中的图⽚23 if(nsKey(url)) {24 SoftReference softReference =(url);2526 if (() != null) {27 ();28 }29 }3031 //缓存中没有图⽚,就从⽹络中获取图⽚,同时,存⼊缓存32 _(newRunnable() {3334 @Override35 public voidrun() {36 final Drawable drawable =getImage(url);37 (url, newSoftReference(drawable));3839 _(newRunnable() {4041 @Override42 public voidrun() {43 oaded(drawable);44 }45 });46 }47 });4849 return null;50 }5152 //从⽹络中获取图⽚53 protectedDrawable getImage(String url) {54 Drawable drawable = null;5556 try{57 drawable = FromStream(new URL(url).openStream(), "");58 } catch(Exception e) {tackTrace();60 }6162 returndrawable;63 }6465 //回调⽅法66 public interfaceCallback {67 voidimageLoaded(Drawable drawable);68 }69 }类库创建好了以后,在 Fragment 的后台代码中进⾏调⽤(含代码建⽴页⾯布局),代码以下:1 public class HomeFrg extendsFragment {23 privateLinearLayout _layout;4 //private TestImage _testImage = new TestImage();56 publicHomeFrg() {7 //Required empty public constructor8 }910 @Override11 publicView onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {13View view = e(_home, container, false);14 initView(view);1516 //Inflate the layout for this fragment17 returnview;18 }1920 private voidinitView(View view) {21 _layout =(LinearLayout) ewById(_home);2223 for (int i = 0; i < 3; i++) {24 initCell(view);25 }26 }2728 private voidinitCell(View view) {29 Context self = text();3031 //建⽴单个的单元格的容器(RelativeLayout)32 Params layoutWrapper =Params(_PARENT,_CONTENT);33 RelativeLayout wrapper = newRelativeLayout(self);kgroundColor(or(self, hite));35 ding(0, 30, 0, 30);36_w(wrapper, layoutWrapper);3738 //建⽴封⾯图⽚(ImageView)39 Params layoutCover = Params(_PARENT, 600);40 ImageView imgCover =newImageView(self);41 int idCover =teViewId();42 (idCover);43 //异步加载⽹络图⽚(图⽚URL为测试图⽚)44 loadImage("/20100904/4845745_6_", imgCover);leType(_CROP);46 ding(20, 0, 20, 0);w(imgCover, layoutCover);4849 //建⽴标题(TextView)50 Params layoutTitle =Params(_PARENT,_CONTENT);51 gins(20, 0, 20, 0);e(, idCover);53 TextView txtTitle = newTextView(self);54 int idTitle=teViewId();55 (idTitle);56 t("标题内容标题内容标题内容标题内容标题内容标题内容");tSize(20);58 //标题单⾏显⽰,多余的字符⽤省略号代替(包括如下两⾏)59 ipsize();60 gleLine();61 tColor(or(self,lack));62 w(txtTitle, layoutTitle);6364 //建⽴做者(TextView)65 Params layoutAuthor =Params(_PARENT,_CONTENT);66 gins(20, 0, 20, 0);e(, idTitle);68 TextView txtAuthor = newTextView(self);69 int idAuthor=teViewId();70 (idAuthor);71 t("做者名称");tColor(or(self, lack));73 w(txtAuthor, layoutAuthor);7475 //建⽴⽇期(TextView)76 Params layoutTime =Params(_PARENT,_CONTENT);77 gins(20, 0, 20, 0);e(, idAuthor);79 TextView txtTime = newTextView(self);80 t("2016年9⽉22⽇ 16:33");81 w(txtTime, layoutTime);82 }8384 //再次封装 TestImage,实现异步加载,⽅便页⾯内调⽤85 private void loadImage(String url, finalImageView imageView) {86 Drawable imgCache = new TestImage().getImage(url,ck() {8788 @Override89 public voidimageLoaded(Drawable drawable) {90 geDrawable(drawable);91 }92 });9394 if (imgCache != null) {95 geDrawable(imgCache);96 }97 }98 }⾄此,全部功能实现完毕。【特别说明】上述代码在建⽴布局时,若是碰到最终效果,多个控件(包括 ImageView 和 TextView)重叠时,那是因为 RelativeLayout 的布局的特殊性,须要声明⼏个关键的东西:⼀、声明 LayoutParams layout⼆、控件.setId(teViewId())三、e(, 上述 generateViewId() 所产⽣的 Id)注意以上三点,便可在 RelativeLayout 中,将各个控件依次分开排列布局。同时,可经过 gins 或 控件.setPadding 进⾏各处留⽩距离的微调。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1689216984a222408.html
评论列表(0条)