项目GitHub地址https://github.com/tikeyc/TNinePlaceGridView_Android https://github.com/tikeyc/TikeycAndroid
玩Android不久,根据iOS实现思路https://github.com/tikeyc/TNinePlaceGridView
封装了一个。详情见TNinePlaceGridView

说说我的实现思路:

逐渐掌握了Android开发套路,是时候自己去封装一些东西了。网上看了一些例子,感觉不是我想要的那种,我希望是直接导入就用,没有Activity,没有xml布局文件,全代码创建那种,使用者用起来直接用到一个类或者两个类就OK的那种。故此花了一点时间封装了这么一个九宫格:
需要有这么一个控件,这个控件是一个图片控件TScallImageView,点击这个图片会从图片位置开始放大至全屏TImageListBgView,点击后全屏缩小到原来位置,且放大缩小过程背景透明可以看见当前UI界面;这个全屏大部分人可能是start一个Activity(这样的话还得再功能清单文件添加该Activity,这不是我想要的),这里我直接添加到了window上;这些代码逻辑主要都写在TImageListBgView类中。

这里需要获取图片相对于window的位置:这里自定义了一个记录位置信息的类TRect
package com.tikeyc.tikeycandroid.custom.TNinePlaceGridView;

/**
* Created by public1 on 2017/5/23.
*/ public class TRect { private int left;
private int top;
private int width;
private int height; public TRect(int left, int top, int width, int height) {
this.left = left;
this.top = top;
this.width = width;
this.height = height;
} public int getLeft() {
return left;
} public int getTop() {
return top;
} public int getWidth() {
return width;
} public int getHeight() {
return height;
} public void setLeft(int left) {
this.left = left;
} public void setTop(int top) {
this.top = top;
} public void setWidth(int width) {
this.width = width;
} public void setHeight(int height) {
this.height = height;
} @Override
public String toString() {
return "TRect{" +
"left=" + left +
", top=" + top +
", width=" + width +
", height=" + height +
'}';
}
}
图片控件:TScallImageView
  • 该控件可以xml中创建也可代码创建,不过在调用其showImageToWindow()方法之前,需设置一下几个属性值:其中imageId及imageIds可以是图片URL也可以是图片id值。
    public ViewGroup ninePlaceGridView;//外部设置
public Object imageId;//外部设置
public List<Object> imageIds;//外部设置
public int currentIndex;//外部设置
package com.tikeyc.tnineplacegridviewlibrary.TNinePlaceGridView;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup; import java.util.ArrayList;
import java.util.List; /**
* Created by public1 on 2017/5/19.
*/ public class TScallImageView extends android.support.v7.widget.AppCompatImageView { public static final int STATE_NORMAL = ;
public static final int STATE_TRANSFORM_IN = ;
public static final int STATE_TRANSFORM_OUT = ; public ViewGroup ninePlaceGridView;//外部设置
private TRect originalRect;//得到的第一个图片相对于window的位置
private List<TRect> originalRects;//得到的第所有图片相对于window的位置
public Object imageId;//外部设置
public List<Object> imageIds;//外部设置
public int currentIndex;//外部设置
public TImageListBgView imageListBgView; public TScallImageView(Context context) {
super(context);
init();
} public TScallImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
} public TScallImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
} private void init() {
setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
showImageToWindow();
}
});
} /**获取每个图片相对于window的位置
* @return
*/
private List<TRect> getOriginalRects() {
List<TRect> originalRects = new ArrayList<TRect>();
int count = ninePlaceGridView.getChildCount();
for (int i = ; i < count; i++) {
if (ninePlaceGridView.getChildAt(i) instanceof TScallImageView) {
TScallImageView scallImageView = (TScallImageView) ninePlaceGridView.getChildAt(i);
int[] outLocation = new int[];
scallImageView.getLocationInWindow(outLocation);
Log.e("TAG","outLocation[0]:" + outLocation[] + "outLocation[1]:" + outLocation[]);
TRect tRect = new TRect(outLocation[],outLocation[],scallImageView.getWidth(),scallImageView.getHeight());
originalRects.add(tRect);
} else {
continue;
} }
this.originalRects = originalRects;
return originalRects;
} public void showImageToWindow() {
int[] outLocation = new int[];
getLocationInWindow(outLocation);
// originalRect = new TRect(getLeft(),getTop(),getWidth(),getHeight());
// originalRect = new TRect(outLocation[0],outLocation[1] - TKCUtils.getStatusBarHeight(getContext()),getWidth(),getHeight());
originalRect = new TRect(outLocation[],outLocation[],getWidth(),getHeight());
imageListBgView = new TImageListBgView(getContext(),originalRect,this.imageId,this.imageIds,currentIndex);
imageListBgView.imageId = imageId;
imageListBgView.originalRects = getOriginalRects();
imageListBgView.startTransform(TScallImageView.STATE_TRANSFORM_IN); } }
TImageListBgView:图片放大缩小动画,横向滑动浏览等逻辑处理类
  • 点击手机的返回按键,缩小图片:这里需要注意一点,在window上添加视图后点击手机的返回按键,不会响应当前的Activity,因此需要在添加在window上的视图TImageListBgView内重写public boolean dispatchKeyEvent(KeyEvent event)方法来实现:
/**因此View添加在Window,点击手机返回按钮无法响应,
* 重写此方法可以处理点击手机返回的逻辑处理,缩小图片到原位置
* @param event
* @return
*/
@Override
public boolean dispatchKeyEvent(KeyEvent event) {//2-4
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (mState == TScallImageView.STATE_TRANSFORM_IN) {
startTransform(TScallImageView.STATE_TRANSFORM_OUT);
return true;
}
}
return super.dispatchKeyEvent(event);
}
package com.tikeyc.tnineplacegridviewlibrary.TNinePlaceGridView;

import android.animation.Animator;
import android.animation.PropertyValuesHolder;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout; import com.squareup.picasso.Picasso; import java.util.List; /**
* Created by public1 on 2017/5/23.
*/ public class TImageListBgView extends RelativeLayout { public int mState = TScallImageView.STATE_NORMAL;
private TRect originalRect;
public List<TRect> originalRects;
public Object imageId;
public List<Object> imageIds;
public int currentIndex;
private ImageView animationIV;
private LinearLayout gridViewBgView;
private GridView gridView;
private TPageHorizatalScrollView horizontalScrollView;
private TPageControl pageControl; public TImageListBgView(Context context, TRect originalRect,Object imageId,List<Object> imageIds,int currentIndex) {
super(context);
this.originalRect = originalRect;
this.imageId = imageId;
this.imageIds = imageIds;
this.currentIndex = currentIndex;
setBackgroundColor(Color.TRANSPARENT);
initSubViews();
} public TImageListBgView(Context context) {
super(context);
} public TImageListBgView(Context context, AttributeSet attrs) {
super(context, attrs);
} public TImageListBgView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
} /**因此View添加在Window,点击手机返回按钮无法响应,
* 重写此方法可以处理点击手机返回的逻辑处理,缩小图片到原位置
* @param event
* @return
*/
@Override
public boolean dispatchKeyEvent(KeyEvent event) {//2-4
if (event.getKeyCode() == KeyEvent.KEYCODE_BACK) {
if (mState == TScallImageView.STATE_TRANSFORM_IN) {
startTransform(TScallImageView.STATE_TRANSFORM_OUT);
return true;
}
}
return super.dispatchKeyEvent(event);
} @Override
public boolean dispatchKeyEventPreIme(KeyEvent event) {//1-3
return super.dispatchKeyEventPreIme(event);
} private WindowManager windowManager;
private void initSubViews() {
//
initImageListBgView();
//
initAnimationIV();
//
initHorizontalScrollView();
//
initGridView();
//
initPageControl();
} private void initImageListBgView() {
Activity activity = (Activity) getContext();
windowManager = activity.getWindowManager();
WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams();
layoutParams.width = TRect.getScreenWidth(getContext());
layoutParams.height = TRect.getScreenHeight(getContext());
//FLAG_LAYOUT_IN_SCREEN
layoutParams.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN;
layoutParams.format = PixelFormat.RGBA_8888;//让背景透明,放大过程可以看到当前界面
layoutParams.verticalMargin = ;
windowManager.addView(this,layoutParams);
} private void initAnimationIV() {
animationIV = new ImageView(getContext());
// imageView.setBackgroundColor(Color.RED);
animationIV.setScaleType(ImageView.ScaleType.FIT_CENTER);
LayoutParams params = new LayoutParams(originalRect.getWidth(),originalRect.getHeight());
params.leftMargin = originalRect.getLeft();
params.topMargin = originalRect.getTop();
addView(animationIV,params);
// Picasso.with(getContext()).load("http://ww2.sinaimg.cn/mw690/9e6995c9gw1f2uu70bzohj209q06g3yw.jpg").into(animationIV);
if (imageId instanceof Integer) {
animationIV.setImageResource((Integer) imageId);
} else {
Picasso.with(getContext()).load((String) imageId).into(animationIV);
} } private void initHorizontalScrollView() {
horizontalScrollView = new TPageHorizatalScrollView(getContext());
LayoutParams hsLayoutParams = new LayoutParams(TRect.getScreenWidth(getContext()),TRect.getScreenHeight(getContext()));
hsLayoutParams.leftMargin = ;
hsLayoutParams.topMargin = ;
addView(horizontalScrollView,hsLayoutParams);
horizontalScrollView.mBaseScrollX = currentIndex*TRect.getScreenWidth(getContext());
horizontalScrollView.setOnScrollToIndexListen(new TPageHorizatalScrollView.OnScrollToIndexListen() {
@Override
public void scrollToIndex(int index) {
currentIndex = index;
if (currentIndex >= imageIds.size()){
currentIndex = imageIds.size() - ;
} else if (currentIndex < ) {
currentIndex = ;
}
Log.e("TAG","currentIndex" + currentIndex);
if (imageId instanceof Integer) {
animationIV.setImageResource((Integer) imageIds.get(currentIndex));
} else {
Picasso.with(getContext()).load((String) imageIds.get(currentIndex)).into(animationIV);
} originalRect = originalRects.get(currentIndex);
pageControl.setCurrentPage(currentIndex);
}
});
int numColumns = imageIds.size();
gridViewBgView = new LinearLayout(getContext());
LinearLayout.LayoutParams testParams = new LinearLayout.LayoutParams(TRect.getScreenWidth(getContext())*numColumns,TRect.getScreenHeight(getContext()));
horizontalScrollView.addView(gridViewBgView,testParams);
} private void initGridView() {
int numColumns = imageIds.size();
//
gridView = new GridView(getContext());
gridView.setNumColumns(numColumns);
gridView.setColumnWidth(TRect.getScreenWidth(getContext()));
LinearLayout.LayoutParams gridViewLayoutParams = new LinearLayout.LayoutParams(TRect.getScreenWidth(getContext())*numColumns,TRect.getScreenHeight(getContext()));
gridViewLayoutParams.leftMargin = ;
gridViewLayoutParams.topMargin = ;
gridViewBgView.addView(gridView,gridViewLayoutParams);
final TImageGridViewAdapter adapter = new TImageGridViewAdapter(getContext());
adapter.imageIds = this.imageIds;
gridView.setAdapter(adapter);
adapter.setOnItemClickListener(new TImageGridViewAdapter.OnItemClickListener() {
@Override
public void onItemClick(int i, View view) {
startTransform(TScallImageView.STATE_TRANSFORM_OUT);
}
}); // gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
// @Override
// public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
// startTransform(TScallImageView.STATE_TRANSFORM_OUT);
// }
// });
} private void initPageControl() {
pageControl = new TPageControl(getContext(),null);
pageControl.setPageNumber(imageIds.size());
pageControl.setSelectedColor(Color.RED);
LayoutParams layoutParams = new LayoutParams(TRect.getScreenWidth(getContext()),);
layoutParams.topMargin = TRect.getScreenHeight(getContext()) - ;
addView(pageControl,layoutParams);
} /**放大缩小动画
* @param state
*/
public void startTransform(final int state) { final int duration = ;
ValueAnimator valueAnimator = new ValueAnimator();
valueAnimator.setDuration(duration);
valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
if (state == TScallImageView.STATE_TRANSFORM_IN) {
setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
mState = TScallImageView.STATE_TRANSFORM_IN;
gridViewBgView.setVisibility(INVISIBLE);
pageControl.setVisibility(INVISIBLE);
// PropertyValuesHolder scaleHolder = PropertyValuesHolder.ofFloat("scale", mTransfrom.startScale, mTransfrom.endScale);
PropertyValuesHolder leftHolder = PropertyValuesHolder.ofFloat("left",originalRect.getLeft(), );
PropertyValuesHolder topHolder = PropertyValuesHolder.ofFloat("top", originalRect.getTop(), );
PropertyValuesHolder widthHolder = PropertyValuesHolder.ofFloat("width", originalRect.getWidth(), TRect.getScreenWidth(getContext()));
PropertyValuesHolder heightHolder = PropertyValuesHolder.ofFloat("height", originalRect.getHeight(), TRect.getScreenHeight(getContext()));
PropertyValuesHolder alphaHolder = PropertyValuesHolder.ofInt("alpha", , );
valueAnimator.setValues(leftHolder, topHolder, widthHolder, heightHolder, alphaHolder);
} else {
// setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN);
gridViewBgView.setVisibility(INVISIBLE);
pageControl.setVisibility(INVISIBLE);
animationIV.setVisibility(VISIBLE);
setBackgroundColor(Color.TRANSPARENT);
mState = TScallImageView.STATE_TRANSFORM_OUT;
// PropertyValuesHolder scaleHolder = PropertyValuesHolder.ofFloat("scale", mTransfrom.endScale, mTransfrom.startScale);
PropertyValuesHolder leftHolder = PropertyValuesHolder.ofFloat("left", animationIV.getLeft(), originalRect.getLeft());
PropertyValuesHolder topHolder = PropertyValuesHolder.ofFloat("top", animationIV.getTop(), originalRect.getTop());
PropertyValuesHolder widthHolder = PropertyValuesHolder.ofFloat("width", animationIV.getWidth(), originalRect.getWidth());
PropertyValuesHolder heightHolder = PropertyValuesHolder.ofFloat("height", animationIV.getHeight(), originalRect.getHeight());
PropertyValuesHolder alphaHolder = PropertyValuesHolder.ofInt("alpha", , );
valueAnimator.setValues(leftHolder, topHolder, widthHolder, heightHolder, alphaHolder); // Handler handler = new Handler(){
// @Override
// public void handleMessage(Message msg) {
// super.handleMessage(msg);
// animationIV.setScaleType(ImageView.ScaleType.CENTER_CROP);//根据九宫格中的图片的显示模式设置
// }
// };
// handler.sendEmptyMessageDelayed(0,duration*9/10);
} valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public synchronized void onAnimationUpdate(ValueAnimator animation) {
// mTransfrom.scale = (Float) animation.getAnimatedValue("scale");
Float left = (Float) animation.getAnimatedValue("left");
Float top = (Float) animation.getAnimatedValue("top");
Float width = (Float) animation.getAnimatedValue("width");
Float height = (Float) animation.getAnimatedValue("height");
Integer mBgAlpha = (Integer) animation.getAnimatedValue("alpha"); LayoutParams layoutParams = new LayoutParams(width.intValue(),height.intValue());
layoutParams.leftMargin = left.intValue();
layoutParams.topMargin = top.intValue();
animationIV.setLayoutParams(layoutParams);
setAlpha(mBgAlpha);
}
});
final TImageListBgView[] imageListBgView = {this};
valueAnimator.addListener(new ValueAnimator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) { } @Override
public void onAnimationRepeat(Animator animation) { } @Override
public void onAnimationEnd(Animator animation) {
/*
* 如果是进入的话,当然是希望最后停留在center_crop的区域。但是如果是out的话,就不应该是center_crop的位置了
* , 而应该是最后变化的位置,因为当out的时候结束时,不回复视图是Normal,要不然会有一个突然闪动回去的bug
*/
// TODO 这个可以根据实际需求来修改
if (mState == TScallImageView.STATE_TRANSFORM_IN) {
horizontalScrollView.baseSmoothScrollTo();
setBackgroundColor(Color.BLACK);
pageControl.setVisibility(VISIBLE);
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
gridViewBgView.setVisibility(VISIBLE);
animationIV.setVisibility(INVISIBLE);
}
};
handler.sendEmptyMessageDelayed(, duration);
} else if (mState == TScallImageView.STATE_TRANSFORM_OUT) {
gridViewBgView.removeView(gridView);
gridView = null;
horizontalScrollView.removeView(gridViewBgView);
gridViewBgView = null;
removeView(animationIV);
animationIV = null;
removeView(pageControl);
pageControl = null;
windowManager.removeView(imageListBgView[]);
imageListBgView[] = null;
}
} @Override
public void onAnimationCancel(Animator animation) { }
});
valueAnimator.start(); } }
如何使用,非常之简单
- List<List<Object>> imageNames2D = new ArrayList<List<Object>>();
List<Object> imageNames = new ArrayList<Object>();
imageNames2D.add(imageNames);
imageNames.add(Object);
- TNinePlaceGridView ninePlaceGridView = (TNinePlaceGridView) view.findViewById(R.id.ninePlaceGridView);
- ninePlaceGridView.setImageNames(imageNames);

如下代码示例:

public class MainActivity extends AppCompatActivity {

    @ViewInject(R.id.listView)
private ListView listView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
x.view().inject(this);
init(); } private void init() { List<List<Object>> imageNames2D = new ArrayList<List<Object>>();
for (int i = ; i < ; i++) {
ArrayList<Object> imageNames = new ArrayList<Object>();
Random random = new Random();
for (int j = ; j <= random.nextInt(); j++) {
if (j% == ) {
imageNames.add(R.mipmap.beauty);
// imageNames.add("http://7xi8d6.com1.z0.glb.clouddn.com/20171011084856_0YQ0jN_joanne_722_11_10_2017_8_39_5_505.jpeg");
} else {
imageNames.add(R.mipmap.glenceluanch);
// imageNames.add("http://7xi8d6.com1.z0.glb.clouddn.com/2017-10-10-sakura.gun_10_10_2017_12_33_34_751.jpg");
}
}
imageNames2D.add(imageNames);
}
ListViewAdapter listViewAdapter = new ListViewAdapter(this);
listViewAdapter.imageNames2D = imageNames2D;
listView.setAdapter(listViewAdapter);
} @Override
protected void onResume() {
super.onResume(); } @Override
protected void onPause() {
super.onPause(); } @Override
protected void onDestroy() {
super.onDestroy(); } private class ListViewAdapter extends BaseAdapter { private Context context;
public List<List<Object>> imageNames2D; public ListViewAdapter(Context context) {
this.context = context;
} @Override
public int getCount() {
if (imageNames2D != null) return imageNames2D.size();
return ;
} @Override
public Object getItem(int i) {
return null;
} @Override
public long getItemId(int i) {
return ;
} private class ViewHelper {
CircleImageView imageViewIcon;
TextView textViewNickName;
TNinePlaceGridView ninePlaceGridView; } @Override
public View getView(int i, View view, ViewGroup viewGroup) { ViewHelper viewHelper;
if (view == null) {
view = View.inflate(context,R.layout.timage_listactivity_listview_item,null);
viewHelper = new ViewHelper();
viewHelper.imageViewIcon = (CircleImageView) view.findViewById(R.id.imageViewIcon);
viewHelper.textViewNickName = (TextView) view.findViewById(R.id.textViewNickName);
viewHelper.ninePlaceGridView = (TNinePlaceGridView) view.findViewById(R.id.ninePlaceGridView); view.setTag(viewHelper);
} else {
viewHelper = (ViewHelper) view.getTag();
}
List<Object> imageNames = this.imageNames2D.get(i);
viewHelper.ninePlaceGridView.setImageNames(imageNames); return view;
}
} }

Android 实现九宫格、点击图片放大全屏浏览等的更多相关文章

  1. 点击图片video全屏

    <!doctype html> <html> <head> <meta charset="utf-8" /> <title&g ...

  2. 69、Android 布局中轻松实现图片的全屏、居中、平铺

    public void paint() { if (item.laying_mode != 1)//平铺或者充满 { new AsyncTask<Void, Void, Void>() { ...

  3. 网页mp3语音展示,点击图片放大,点击图片跳转链接,调表格

    查看mp3语音 <td class="value"><embed src="${sounds.soundName}" type="a ...

  4. JavaScript 点击图片放大功能

    <!doctype html> <html> <head> <meta charset="utf-8" /> <title&g ...

  5. js+jquery+html实现在三种不通的情况下,点击图片放大的效果

    js+jquery+html实现在三种不通的情况下,点击图片放大的效果. 三种情况分别是:图片的父元素宽高固定;  图片的宽高固定;  图片的父元素宽固定,高度不固定 第一种情况:图片的父元素宽高固定 ...

  6. 微信小程序点击图片放大预览

    微信小程序点击图片放大预览使用到 wx.previewImage 接口,可以放大.上/下一张 上代码 wxml代码 <view class='content-img' wx:if="{ ...

  7. vue项目 一行js代码搞定点击图片放大缩小

    一行js代码搞定xue项目需要点击图片放大缩小,其实主要用的是用到了vue:class的动态切换,内容比较简单.一开始我把维护的需求想得太复杂了,和测试小姐姐聊了一下才反应过来. 两个月不到跟了四个项 ...

  8. JavaScript 实现用户点击图片放大

    JavaScript 实现用户点击图片放大 一.契机 情况是这样的,之前推荐朋友去建站.后面他专门写了一篇文章说如何实现 "用户点击图片实现放大效果",俺就好好 "拜读& ...

  9. layui点击图片放大-多图显示

    layui点击图片放大-多图显示 标签(空格分隔): js HTML // div <div id="photo-list"> <img class=" ...

随机推荐

  1. Linux中进程控制块PCB-------task_struct结构体结构

    Linux中task_struct用来控制管理进程,结构如下: struct task_struct { //说明了该进程是否可以执行,还是可中断等信息 volatile long state; // ...

  2. AndroidStudio检测不到genymotion虚拟设备

    重启adb 单击  Reset adb

  3. html中调用本地exe应用程序

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. git搭建私有仓库

    git gui参考 https://ask.helplib.com/git/post_1004941

  5. ASP.NET Core会议管理平台实战_1、开篇介绍

    用到四个数据库

  6. 201621123016 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 关键字:接口,多态,Comparable,Comparator 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不 ...

  7. CodeForces水题

    CodeForces754A 题意: 给一个数组,让你变成1-n,输出变换区间,要求原区间和不为0. 思路: 如果原数组不为0,那就是YES: 如果为0,则从1开始扫过去,碰到不为0时,分两个区间[1 ...

  8. [Xcode 实际操作]九、实用进阶-(21)使用“调试视图”查看各界面元素的层次顺序

    目录:[Swift]Xcode实际操作 本文将演示如何在程序运行期间,查看模拟器各界面元素的层次顺序. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import ...

  9. Mol Cell Proteomics. |彭建祥| 人胃肠道间质瘤亚群蛋白质组图谱

    大家好,本周分享的是发表在Molecular & Cellular Proteomics 上的一篇关于人胃肠道间质瘤亚群蛋白质组图谱的文章,题目是Proteomic maps of human ...

  10. mysql 5.5.58 tar包安装部署

    环境: centos 7.4 64位 mysql 版本,5.5.58 glibc 64 位版,下载地址:https://dev.mysql.com/downloads/mysql/5.5.html#d ...