android 图片浏览器
自定义了gallary和ImageView:
gallary:
public class MyGallery extends Gallery {
/**
* GestureDetector类 在onTouch()方法中,我们调用GestureDetector的onTouchEvent()方法,
* 将捕捉到的MotionEvent交给GestureDetector 来分析是否有合适的callback函数来处理用户的手势
*/
private GestureDetector gestureScanner;
private MyPicImageView imageView;
public MyGallery(Context context) {
super(context);
}
public MyGallery(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MyGallery(Context context, AttributeSet attrs) {
super(context, attrs);
gestureScanner = new GestureDetector(new MySimpleGesture());
this.setOnTouchListener(new OnTouchListener() {
float baseValue;
float originalScale;
// 重写onTouch方法实现缩放
@Override
public boolean onTouch(View v, MotionEvent event) {
RelativeLayout relayout = (RelativeLayout) MyGallery.this
.getSelectedView();
View view = relayout.findViewById(R.id.pic);
if (view instanceof MyPicImageView) {
imageView = (MyPicImageView) view;
if (event.getAction() == MotionEvent.ACTION_DOWN) {
baseValue = 0;
originalScale = imageView.getScale();
}
if (event.getAction() == MotionEvent.ACTION_MOVE) {
// 处理拖动
if (event.getPointerCount() == 2) {
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
float value = (float) Math.sqrt(x * x + y * y);// 计算两点的距离
if (baseValue == 0) {
baseValue = value;
}
float scale = value / baseValue;// 当前两点间的距离除以手指落下时两点间的距离就是需要缩放的比例。
// scale the image
imageView.zoomTo(originalScale * scale,
x + event.getX(1), y + event.getY(1));
}
}
}
return false;
}
});
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
float distanceY) {
RelativeLayout relayout = (RelativeLayout) MyGallery.this
.getSelectedView();
View view = relayout.findViewById(R.id.pic);
if (view instanceof MyPicImageView) {
imageView = (MyPicImageView) view;
float v[] = new float[9];
Matrix m = imageView.getImageMatrix();
m.getValues(v);
// 图片实时的上下左右坐标
float left, right;
// 图片的实时宽,高
float width, height;
width = imageView.getScale() * imageView.getImageWidth();
height = imageView.getScale() * imageView.getImageHeight();
// 下面逻辑为移动图片和滑动gallery换屏的逻辑。如果没对整个框架了解的非常清晰,勿动以下代码
if ((int) width <= EnLargePicActivity.screenWidth
&& (int) height <= EnLargePicActivity.screenHeight)// 如果图片当前大小<屏幕大小,直接处理滑屏事件
{
super.onScroll(e1, e2, distanceX, distanceY);
} else {
left = v[Matrix.MTRANS_X];
right = left + width;
Rect r = new Rect();
imageView.getGlobalVisibleRect(r);
// Log.i("lyc", "distanceX:" +
// distanceX+"r.left::"+r.left+"r.right::"+r.right+"distanceY::"+distanceY+"r.top::"+r.top+"r.bottom::"+r.bottom);
if (distanceX > 0)// 向左滑动
{
if (r.left > 0) {// 判断当前ImageView是否显示完全
super.onScroll(e1, e2, distanceX, distanceY);
} else if (right < EnLargePicActivity.screenWidth) {
super.onScroll(e1, e2, distanceX, distanceY);
} else {
imageView.postTranslate(-distanceX, -distanceY);
}
} else if (distanceX < 0)// 向右滑动
{
if (r.right < EnLargePicActivity.screenWidth) {
super.onScroll(e1, e2, distanceX, distanceY);
} else if (left > 0) {
super.onScroll(e1, e2, distanceX, distanceY);
} else {
imageView.postTranslate(-distanceX, -distanceY);
}
}
if (distanceY > 0) {// 向下滑
imageView.postTranslate(-distanceX, -distanceY);
} else {// 向上滑
imageView.postTranslate(-distanceX, -distanceY);
}
}
} else {
super.onScroll(e1, e2, distanceX, distanceY);
}
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
float velocityY) {
return false;// 这样
@Override
public boolean onTouchEvent(MotionEvent event) {
gestureScanner.onTouchEvent(event);
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_UP:
// 判断上下边界是否越界
RelativeLayout relayout = (RelativeLayout) MyGallery.this
.getSelectedView();
View view = relayout.findViewById(R.id.pic);
if (view instanceof MyPicImageView) {
imageView = (MyPicImageView) view;
float width = imageView.getScale() * imageView.getImageWidth();
float height = imageView.getScale()
* imageView.getImageHeight();
if ((int) width <= EnLargePicActivity.screenWidth&& (int) height <= EnLargePicActivity.screenHeight)// 如果图片当前大小<屏幕大小,判断边界
{break;
}
float v[] = new float[9];
Matrix m = imageView.getImageMatrix();
m.getValues(v);
float top = v[Matrix.MTRANS_Y];
float bottom = top + height;
if (top > 0) {
imageView.postTranslateDur(-top, 200f);
}Log.i("lyc", "bottom:" + bottom);
if (bottom < EnLargePicActivity.screenHeight) {
imageView.postTranslateDur(EnLargePicActivity.screenHeight
- bottom, 200f);
}
}
break;
}
return super.onTouchEvent(event);
}
private class MySimpleGesture extends SimpleOnGestureListener {
// 按两下的第二下Touch down时触发
public boolean onDoubleTap(MotionEvent e) {
RelativeLayout relayout = (RelativeLayout) MyGallery.this
.getSelectedView();
View view = relayout.findViewById(R.id.pic);
if (view instanceof MyPicImageView) {
imageView = (MyPicImageView) view;
if (imageView.getScale() > imageView.getScaleRate()) {
imageView.zoomTo(imageView.getScaleRate(),
EnLargePicActivity.screenWidth / 2,
EnLargePicActivity.screenHeight / 2, 200f);
// imageView.layoutToCenter();
} else {
imageView.zoomTo(1.0f, EnLargePicActivity.screenWidth / 2,
EnLargePicActivity.screenHeight / 2, 200f);
}
} else {
}
// return super.onDoubleTap(e);
return true;
}
}
}
ImageView::::::::::::::
public class MyPicImageView extends ImageView {
public MyPicImageView(Context context) {
super(context);
init();
}
public MyPicImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyPicImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
@SuppressWarnings("unused")
private static final String TAG = "ImageViewTouchBase";
protected Matrix mBaseMatrix = new Matrix();
protected Matrix mSuppMatrix = new Matrix();
private final Matrix mDisplayMatrix = new Matrix();
private final float[] mMatrixValues = new float[9];
protected Bitmap image = null;
int mThisWidth = -1, mThisHeight = -1;
float mMaxZoom = 3f;// 最大缩放比例
float mMinZoom=0.1f;// 最小缩放比例
private int imageWidth;// 图片的原始宽度
private int imageHeight;// 图片的原始高度
private float scaleRate;// 图片适应屏幕的缩放比例
/**
* 解决放大后超出屏幕大小的图片上滑,下滑总是靠顶部或底部停靠
*/
protected void onDraw(Canvas canvas) {
// 正在显示的图片实际宽高
float width = imageWidth * getScale();
float height = imageHeight * getScale();
if (width > EnLargePicActivity.screenWidth) {
// 如果图宽大于屏宽,就不用水平居中
center(true, true);
} else {
center(true, true);
}super.onDraw(canvas);
}
/**
* 计算图片要适应屏幕需要缩放的比例
*/
private void arithScaleRate() {
float scaleWidth = EnLargePicActivity.screenWidth / (float) imageWidth;
float scaleHeight = EnLargePicActivity.screenHeight
/ (float) imageHeight;
scaleRate = Math.min(scaleWidth, scaleHeight);}
public float getScaleRate() {
return scaleRate;
}
public int getImageWidth() {
return imageWidth;
}
public void setImageWidth(int imageWidth) {
this.imageWidth = imageWidth;
}
public int getImageHeight() {
return imageHeight;
}
public void setImageHeight(int imageHeight) {
this.imageHeight = imageHeight;
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
event.startTracking();
return true;
}return super.onKeyDown(keyCode, event);
}
@Override
public boolean onKeyUp(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK && event.isTracking()
&& !event.isCanceled()) {
if (getScale() > 1.0f) {
zoomTo(1.0f);
return true;
}
}
return super.onKeyUp(keyCode, event);
}
protected Handler mHandler = new Handler();
@Override
public void setImageBitmap(Bitmap bitmap) {
super.setImageBitmap(bitmap);
image = bitmap;
// 计算适应屏幕的比例
arithScaleRate();
// 缩放到屏幕大小
zoomTo(scaleRate, EnLargePicActivity.screenWidth / 2f,
EnLargePicActivity.screenHeight / 2f);
// 居中
layoutToCenter();
}
protected void center(boolean horizontal, boolean vertical) {
if (image == null) {
return;
}
Matrix m = getImageViewMatrix();
RectF rect = new RectF(0, 0, image.getWidth(), image.getHeight());
m.mapRect(rect);
float height = rect.height();
float width = rect.width();
float deltaX = 0, deltaY = 0;
if (vertical) {
int viewHeight = getHeight();
if (height < viewHeight) {
deltaY = (viewHeight - height) / 2 - rect.top;
} else if (rect.top > 0) {
deltaY = -rect.top;
} else if (rect.bottom < viewHeight) {
deltaY = getHeight() - rect.bottom;
}
}
if (horizontal) {
int viewWidth = getWidth();
if (width < viewWidth) {
deltaX = (viewWidth - width) / 2 - rect.left;
} else if (rect.left > 0) {
deltaX = -rect.left;
} else if (rect.right < viewWidth) {
deltaX = viewWidth - rect.right;
}}
postTranslate(deltaX, deltaY);
setImageMatrix(getImageViewMatrix());
}
private void init() {
setScaleType(ImageView.ScaleType.MATRIX);
}
/**
* 设置图片居中显示
*/
public void layoutToCenter() {
// 正在显示的图片实际宽高
float width = imageWidth * getScale();
float height = imageHeight * getScale();
// 空白区域宽高
float fill_width = EnLargePicActivity.screenWidth - width;
float fill_height = EnLargePicActivity.screenHeight - height;
// 需要移动的距离
float tran_width = 0f;
float tran_height = 0f;
if (fill_width > 0)
tran_width = fill_width / 2;
if (fill_height > 0)
tran_height = fill_height / 2;
postTranslate(tran_width, tran_height);
setImageMatrix(getImageViewMatrix());
}
protected float getValue(Matrix matrix, int whichValue) {
matrix.getValues(mMatrixValues);
mMinZoom = (EnLargePicActivity.screenWidth / 2f) / imageWidth;
return mMatrixValues[whichValue];
}
protected float getScale(Matrix matrix) {
return getValue(matrix, Matrix.MSCALE_X);
}
protected float getScale() {
return getScale(mSuppMatrix);
}
protected Matrix getImageViewMatrix() {
mDisplayMatrix.set(mBaseMatrix);
mDisplayMatrix.postConcat(mSuppMatrix);
return mDisplayMatrix;
}
static final float SCALE_RATE = 1.25F;
protected float maxZoom() {
if (image == null) {
return 1F;
}
float fw = (float) image.getWidth() / (float) mThisWidth;
float fh = (float) image.getHeight() / (float) mThisHeight;
float max = Math.max(fw, fh) * 4;
return max;
}
protected void zoomTo(float scale, float centerX, float centerY) {
float oldScale = getScale();
if (scale > mMaxZoom) {
scale = mMaxZoom;
} else if (scale < mMinZoom) {
scale = mMinZoom;
}
float deltaScale = scale / oldScale;
mSuppMatrix.postScale(deltaScale, deltaScale, centerX, centerY);
setImageMatrix(getImageViewMatrix());
center(true, true);
}
protected void zoomTo(final float scale, final float centerX,
final float centerY, final float durationMs) {
final float incrementPerMs = (scale - getScale()) / durationMs;
final float oldScale = getScale();
final long startTime = System.currentTimeMillis();
mHandler.post(new Runnable() {
public void run() {
long now = System.currentTimeMillis();
float currentMs = Math.min(durationMs, now - startTime);
float target = oldScale + (incrementPerMs * currentMs);
zoomTo(target, centerX, centerY);
if (currentMs < durationMs) {
mHandler.post(this);
}
}
});
}
protected void zoomTo(float scale) {
float cx = getWidth() / 2F;
float cy = getHeight() / 2F;
zoomTo(scale, cx, cy);
}
protected void zoomToPoint(float scale, float pointX, float pointY) {
float cx = getWidth() / 2F;
float cy = getHeight() / 2F;
panBy(cx - pointX, cy - pointY);
zoomTo(scale, cx, cy);
}
protected void zoomIn() {
zoomIn(SCALE_RATE);
}
protected void zoomOut() {
zoomOut(SCALE_RATE);
}
protected void zoomIn(float rate) {
if (getScale() >= mMaxZoom) {
return;
} else if (getScale() <= mMinZoom) {
return;
}
if (image == null) {
return;
}
float cx = getWidth() / 2F;
float cy = getHeight() / 2F;
mSuppMatrix.postScale(rate, rate, cx, cy);
setImageMatrix(getImageViewMatrix());
}
protected void zoomOut(float rate) {
if (image == null) {
return;
}
float cx = getWidth() / 2F;
float cy = getHeight() / 2F;
Matrix tmp = new Matrix(mSuppMatrix);
tmp.postScale(1F / rate, 1F / rate, cx, cy);
if (getScale(tmp) < 1F) {
mSuppMatrix.setScale(1F, 1F, cx, cy);
} else {mSuppMatrix.postScale(1F / rate, 1F / rate, cx, cy);
}setImageMatrix(getImageViewMatrix());
center(true, true);
}
public void postTranslate(float dx, float dy) {
mSuppMatrix.postTranslate(dx, dy);
setImageMatrix(getImageViewMatrix());}
float _dy = 0.0f;
protected void postTranslateDur(final float dy, final float durationMs) {
_dy = 0.0f;
final float incrementPerMs = dy / durationMs;
final long startTime = System.currentTimeMillis();
mHandler.post(new Runnable() {
public void run() {long now = System.currentTimeMillis();
float currentMs = Math.min(durationMs, now - startTime);
postTranslate(0, incrementPerMs * currentMs - _dy);
_dy = incrementPerMs * currentMs;
if (currentMs < durationMs) {
mHandler.post(this);
}}
});
}
protected void panBy(float dx, float dy) {
postTranslate(dx, dy);
setImageMatrix(getImageViewMatrix());
}}
xml文件布局::::::::::::
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<com.hztbc.android.definedview.MyPicImageView
android:id="@+id/pic"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scaleType="matrix"
android:layout_centerInParent="true"
></com.hztbc.android.definedview.MyPicImageView>
<ProgressBar
android:id="@+id/pb"
android:layout_width="wrap_content"
android:focusable="false"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
/>
</RelativeLayout>
主Activity:::::::::::::::::::
public class EnLargePicActivity extends BaseActivity {
/** Called when the activity is first created. */
// 屏幕的宽度
public static int screenWidth;
// 屏幕的高度
public static int screenHeight;
private MyGallery gallery;
private ArrayList<String> urls;
private int position;
private static PicCache bitMapUtilPublic;
GalleryAdapter galleryAdapter;
@InjectView(R.id.num)
TextView num;
TextView pathTV;
@InjectView(R.id.content)
private RelativeLayout contentRL;
private String imagePaht = null;
private int m_scaleW, m_scaleH;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 设置窗体无标题 全屏
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.main_gallary);
bitMapUtilPublic = new PicCache();
urls = this.getIntent().getStringArrayListExtra("url");
position = this.getIntent().getIntExtra("position", -1);
gallery = (MyGallery) findViewById(R.id.mygallery);
gallery.setVerticalFadingEdgeEnabled(false);
gallery.setHorizontalFadingEdgeEnabled(false);// 设置view在水平滚动时,水平边不淡出。
galleryAdapter = new GalleryAdapter(this, urls, bitMapUtilPublic);
gallery.setAdapter(galleryAdapter);
gallery.setSelection(position);
gallery.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Log.i("--xxl--", "onItemClick:::::" + position + "");
num.setText((position + 1) + "/" + urls}
});
gallery.setOnItemSelectedListener(new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
if(view==null){
view=LayoutInflater.from(getApplicationContext()).inflate(R.layout.gallary_image_item, null);}
num.setText((position + 1) + "/" + urls.size());
GalleryWhetherStop(position, view);}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
// 获取屏幕的大小
int statusBarHeight = ViewUtil.getStatusBarHeight(getResources());
screenWidth = getWindow().getWindowManager().getDefaultDisplay()
.getWidth();
screenHeight = getWindow().getWindowManager().getDefaultDisplay()
.getHeight()
- statusBarHeight;
Log.i("--xxl--", "screenWidth::::::::"+screenWidth+"screenHeight:::::::"+screenHeight);
pathTV = new TextView(this);
pathTV.setTextColor(Color.WHITE);
pathTV.setGravity(Gravity.CENTER_HORIZONTAL);
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.MATCH_PARENT,RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.ALIGN_BOTTOM, R.id.mygallery);
contentRL.addView(pathTV, layoutParams);
gallery.setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
int position, long id) {
Log.i("--xxl--", "onLongClick:::::");
SaveImgSelectDialog fileSelectDialog = new SaveImgSelectDialog(EnLargePicActivity.this,R.style.MyDialog){
@Override
public void doSaveImg() {this.dismiss();
Intent intent = new Intent(EnLargePicActivity.this,
FileManagerActivity.class);
intent.putExtra("flag", true);
startActivityForResult(intent, 100);}
};
fileSelectDialog.show();
Window dialogWindow = fileSelectDialog.getWindow();
WindowManager.LayoutParams lp = dialogWindow.getAttributes();
dialogWindow.setGravity(Gravity.BOTTOM);
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
lp.width = (int)(display.getWidth()); //设置宽度
fileSelectDialog.getWindow().setAttributes(lp);
return true; }
});}
protected void GalleryWhetherStop(final int position, View view) {
final String url = urls.get(position).toString();
final MyPicImageView imageView = (MyPicImageView) view
.findViewById(R.id.pic);
final ProgressBar pb = (ProgressBar) view.findViewById(R.id.pb);
if (!"null".equals(url) && !"".equals(url) && url != null) {
FileLoader.getImageAsync(url, new FileCache.FileDownLoad() {
Bitmap bmp;
@Override
public void onFileLoaded(final File localFile, String remoteurl) {
EnLargePicActivity.this.imagePaht = localFile
.getAbsolutePath();
runOnUiThread(new Runnable() {
bmp = bitMapUtilPublic.getBitmap(localFile
.getAbsolutePath());
if (bmp == null || bmp.isRecycled()) {
imageView.setImageBitmap(null);
} else {
Log.i("--xxl--", "Width::::::::"+bmp.getWidth()+"Height:::::::"+bmp.getHeight());
imageView.setImageHeight(bmp.getHeight());
imageView.setImageWidth(bmp.getWidth());
imageView.setImageBitmap(bmp);
imageView.invalidate();
pb.setVisibility(View.GONE);
}
}
});}
@Override
public void onLoading(long filelenght, long downloadedlenght,final int percent) {}
});
}}
@Override
protected void onDestroy() {
bitMapUtilPublic.removeAllBitMap();
super.onDestroy();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 100 && resultCode == RESULT_OK) {
String path = data.getStringExtra("path");
String message = FileUtil.copyFile(this.imagePaht, path + "/");
showMessage(message);
pathTV.setText("已保存至" + path + "文件夹下");
}
}
android 图片浏览器的更多相关文章
- 一步一步打造自己的Android图片浏览器(原创)
今天我们试着来制作一个自己的Android图片浏览器. 图片浏览器应该具有什么功能呢?鉴于不同的人不同的理解,这里提出一个基本的需求: 搜索手机内的所有图片,展示于一个列表中: 列表中展示的是图片的缩 ...
- Android 图片浏览器 从原来位置放大至全屏显示
android 图片浏览器 特点: 1.从网络加载图片,只需要传图片地址数组即可 2.点击图片,从原来位置放大至全屏 3.支持手势操作 4.完全自定义布局 项目源码请到GitHub下载:https:/ ...
- 分享:android图片浏览器—类微信朋友圈相片浏览【android代码下载】
今天给大家分享个android图片/相册浏览器,类似微信朋友圈相片浏览,可以左右滑动,可以双击放大,捏拉放大 效果如下:<ignore_js_op> device-2013-09-04-1 ...
- android 图片浏览器 demo
先上效果图,本demo 会逐步完好 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYTU2NTczMDE2NjEz/font/5a6L5L2T/fontsi ...
- android 图片浏览器滑动切换图片
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools= ...
- Android中轴旋转特效实现,制作别样的图片浏览器
转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/10766017 Android API Demos中有很多非常Nice的例子,这些例 ...
- Android 高级UI设计笔记15:HorizontalScrollView之 实现画廊式图片浏览器
1. HorizontalScrollView 本来,画廊式的图片浏览器,使用Android中的Gallery就能轻松完成,但是Google说Gallery每次切换图片时都要新建视图,造成太多的资源浪 ...
- android调用系统图片浏览器裁切后出现黑边
是这样的:我使用系统的图片浏览器,然后让它自动跳到图片裁切界面,当我们定义了返回的图片大小过大,而我们实际的图片像素达不到时,系统为我们自动地填充了不够的像素成黑色,那么我们怎么样来解决这个问题呢?不 ...
- Android:ImageView应用之图片浏览器
ImageView控件实现的简单图片浏览器 一.纯显示图片: 引言: 读者在做这个东西的时候,需要自己把图片在源程序中导入. 读者要注意:所有导入的图片之前,图片的命名只可以是小写英文和数字. 效果图 ...
随机推荐
- 清除Linux OS 缓存
1.查看内存使用情况 [root@ip---- tpch_2_17_0]# free -m total used free shared buffers cached Mem: -/+ buffers ...
- 使用ISO文件安装Linux
一. 准备知识 1. ISO文件 我们普遍使用的ISO文件是指包含着整个CD-ROM(ISO-9660 文件系统)内容的 映象, 是整个碟片从0扇区到最后一个扇区的完整复制,经常被用来在网络上传输 对 ...
- 第九章 硬件抽象层:HAL
这一章介绍HAL,全称为Hardware Abstract Layer,即硬件抽象层,它是建立在Linux驱动之上的一套程序库,程序库并不属于Linux内核,而是属于Linux内核层之上的应用层.为A ...
- C语言程序设计第六次作业
同学们,本周我们已经学完了顺序结构.选择结构和循环结构,你都理解并掌握了吗?现在就好好理理思路,做个阶段总结吧.本周的知识点总结要求大家在理解的基础上对结构化程序设计的三种基本结构做一个全面的总结. ...
- 亲身试用python简单小爬虫
前几天基友分享了一个贴吧网页,有很多漂亮的图片,想到前段时间学习的python简单爬虫,刚好可以实践一下. 以下是网上很容易搜到的一种方法: #coding=utf-8 import urllib i ...
- YARN资料收集
hdfs2的HA: http://www.cnblogs.com/meiyuanbao/p/hadoop2.html
- Java源码分析系列
1) 深入Java集合学习系列:HashMap的实现原理 2) 深入Java集合学习系列:LinkedHashMap的实现原理 3) 深入Java集合学习系列:HashSet的实现原理 4) 深入Ja ...
- HDU 5015
http://acm.hdu.edu.cn/showproblem.php?pid=5015 矩阵是表示状态转移的利器 这题m很大,n非常小,所以开始的思考角度是能否从当前列推出下一列.有了这个角度, ...
- IOS 宏定义一个单例
有时候是不是因为频繁地创建一个单例对象而头疼,一种方式要写好多遍?当然你可以用OC语言进行封装.但下面将介绍一种由C语言进行的封装.只要实现下面的方法,以后建单例对象只要二句话. 1.新建一个.h文件 ...
- Voreen (二) 入点出点计算
继第一篇Voreen的文章介绍主流程以后,第二篇介绍Raycast的第一个绘制Pass,根据代理几何体绘制出入点出点.如上次所说,OptimizedProxyGeometry负责生成表示体数据的代理几 ...