surfaceView控件大小的缩放及左右滑动

如何实现SurfaceView控件的手势缩放和左右滑动(在播放视频时双指缩放改变SurfaceView的大小,可以左右滑动)

1个回答

ljxzhuce
ljxzhuce 我是要surfaceView实现缩放,而不是里面的图片缩放
大约 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
如何让surfaceview用手势进行缩放
我用surfaceView来画了些图形,我想让图形能够用手势进行平移缩放等操作,跟我们平时用的百度高德地图一样,能够对地图进行缩放平移,请问如何做呢
SurfaceView在ScrollView中滑动背景问题
遇到一个很奇葩的问题,我把SurfaceView放在一个ScorllView当中, 结果滑动ScorllView的时候,SurfaceView的边缘会出现黑色
Android surfaceview控件高度超过8192就不回调surfaceCreated( )函数
**一、问题:** 自己自定义了一个surfaceview,在onMeasurea方法中设置该控件的高度,发现一旦超过8192就不会回调surfaceCreated( )函数,是什么原因造成的?一直想不通为什么会不回调...有这个限制吗? **二、测试的例子:** 这里把surfaceview放到scrollview中,可以上下滑动查看。(把scrollview去掉也出现同样的问题) 当高度大于8192时,查看log打印的信息,发现没有调用surfaceCreated( )。 ``` **1、自定义的TestSurfaceView.java** package com.hebei.textviewdemo6; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.view.SurfaceHolder; import android.view.SurfaceView; public class TestSurfaceView extends SurfaceView implements SurfaceHolder.Callback{ public TestSurfaceView(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub SurfaceHolder holder = getHolder(); holder.addCallback(this); } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub Log.d("surfaceCreated", "created"); Log.d("surfaceCreated", "widht = "+this.getWidth()+" height = "+this.getHeight()); } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub Log.d("surfaceChanged", "changed"); } @Override public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub Log.d("surfaceDestoryed", "destoryed"); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = MeasureSpec.getSize(widthMeasureSpec); int height = 8193; Log.d("onMeasure", "Width = "+width+" Height = "+height); setMeasuredDimension(width, height); } } **2、xml文件** <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.hebei.textviewdemo6.MainActivity" > <ScrollView android:id="@+id/scrollview_demo6" android:layout_width="120dp" android:layout_height="120dp" android:background="#FF0000" android:fadingEdge="vertical" android:scrollbars="vertical" > <com.hebei.textviewdemo6.TestSurfaceView android:layout_width="match_parent" android:layout_height="wrap_content" /> </ScrollView> </RelativeLayout> **3、MainActivity.java** public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("onCreate", "create"); } } ```
SurfaceView获取其中控件的方法?
webview全屏播放视频,通过WebChromeClient的onShowCustomView方法可以获得以一个view,我要控制其进度不可以快进,没有js交互的! 在设置ontouchListener不能控制后,发现webview提供的这个view是一个framelayout,其中包含一个surfaceView,但是怎样通过surfaceView来获取其中的控件、达到控制播放器的效果。。。。。
android中mediaPlayer+surfaceView播放视频如何实现控制video的大小
现在我使用了mediaPlayer与surfaceView播放视频,但是需要实现视频显示全屏和非全屏的切换,我想的一个办法是通过动态改变surfaceView的大小,然后 在surfaceChanged()函数中调用mSurfaceHolder.setSizeFromLayout();使得surface的大小也随之改变了,但是现在问题是:mediaPlayer.getVideoHeight()获取的video的大小一直没有改变,其一直等于播放的视频源的分辨率。请教下如何才能实现改变video的大小。
SurfaceView缩放、拖拽、涂鸦功能,进行坐标换算
改写了一个surfaceView,之前有缩放、拖拽功能,根据我的应用需求,我需要加上涂鸦功能, 在这个过程中,我可以再上面画矩形。画矩形没有问题,但是在画好图形进行缩放的时候,画的矩形来回抖动,不能固定,在坐标换算的时候出问题了,一直找不到问题在哪里,求高人指点。 这里坐标换算,是换算成相对于bitmap的坐标,因为bitmap是等比例缩放的,不是铺满整个surfaceview的 调用源码: ``` public MySurfaceView3 msvZoom; Bitmap bm = BitmapFactory.decodeFile(imgPath); msvZoom.setBitmap(bm); ``` 自定义SurfaceView代码 ``` import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PointF; import android.graphics.Rect; import android.text.TextUtils; import android.util.ArrayMap; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import com.github.niqdev.mjpeg.OnDrawCompleteListener; import com.github.niqdev.mjpeg.bean.Data; /** * @Author hyj * @Date 2017/10/19 19:16 */ public class MySurfaceView3 extends SurfaceView implements SurfaceHolder.Callback, View.OnTouchListener { private static final int NONE = 0;// 原始 private static final int DRAG = 1;// 拖动 private static final int ZOOM = 2;// 放大 private int mStatus = NONE; private static final float MAX_ZOOM_SCALE = 5f; private static final float MIN_ZOOM_SCALE = 1.0f; private static final float FLOAT_TYPE = 1.0f; private float mCurrentMaxScale = MAX_ZOOM_SCALE; private float mCurrentScale = 1.0f; private Rect mRectSrc = new Rect(); // used for render image. //要绘图的位置 private Rect mRectDes = new Rect(); // used for store size of monitor. 要画图的部分 private int mCenterX, mCenterY; int mSurfaceHeight, mSurfaceWidth, mImageHeight, mImageWidth; private PointF mStartPoint = new PointF(); private float mStartDistance = 0f; private SurfaceHolder mSurHolder = null; private Bitmap mBitmap; /********************画图部分********************/ private Paint shapePaint; private String paintColor = "FA1418";//当前画笔颜色 private int paintWidth = 3;//画笔宽度 private String action = Data.ACTION_DRAW;//画图动作 private String style = Data.STYLE_RECTANGLE;//画图形状 private float startX = 0, startY = 0, endX = 0, endY = 0;//位置比例 private float sx = 0, sy = 0, ex = 0, ey = 0; //计算出来当前屏幕中真实位置 private boolean isDrawShape = false;//当前是否处于画图状态 private ArrayMap<String, Data> amShape; private Data tempShape; private OnDrawCompleteListener<Data> onDrawCompleteListener;//标记绘制完成 /** * 还原所有画图的参数 */ private void restoreDrawParams() { startX = startY = endX = endY = 0; sx = sy = ex = ey = 0; isDrawShape = false; amShape.clear(); } /** * 获得画图状态 * * @return */ public boolean isDrawShape() { return isDrawShape; } /** * 设置画图状态 * * @param drawShape */ public void setDrawShape(boolean drawShape) { isDrawShape = drawShape; } /** * 清空所所有标记、注解 */ public void addMarker(Data dataMarker) { if (null == dataMarker || TextUtils.isEmpty(dataMarker.getAction())) { return; } switch (dataMarker.getAction()) { case Data.ACTION_DRAW: amShape.put(dataMarker.getId(), dataMarker); break; case Data.ACTION_DEL: //TODO 删除指定的图形,预留接口 break; case Data.ACTION_DELALL: restoreDrawParams(); break; } showBitmap(); } /** * 一个图形画完之后的回调事件 * * @param onDrawCompleteListener */ public void setOnDrawCompleteListener(OnDrawCompleteListener onDrawCompleteListener) { this.onDrawCompleteListener = onDrawCompleteListener; } /** * 初始化画图属性 */ private void initDrawShape() { amShape = new ArrayMap<String, Data>(); shapePaint = new Paint(); shapePaint.setAntiAlias(false); shapePaint.setStyle(Paint.Style.STROKE); shapePaint.setStrokeCap(Paint.Cap.ROUND); shapePaint.setStrokeJoin(Paint.Join.ROUND); shapePaint.setColor(Color.parseColor("#" + paintColor)); shapePaint.setStrokeWidth(paintWidth); } /** * 计算点X到图片左上角距离与图片宽度的比值 * * @param bmW 图片宽 * @param pointX 点相对于屏幕左上角的X距离 * @return */ private float pointScreen2ImageX(int bmW, float pointX) { return (pointX / mWidthScale - mRectDes.left + mRectSrc.left) * 1.0f / (bmW); } /** * 计算点Y到图片左上角与图片高度的比值 * * @param bmH 图片高度 * @param pointY 点相对于屏幕左上角的Y距离 * @return */ private float pointScreen2ImageY(int bmH, float pointY) { return (pointY / mHeightScale - mRectDes.top + mRectSrc.top) * 1.0f / (bmH); } /** * 把相对于图片的宽比值转换成相对于屏幕上具体的点 * * @param bmW 图片宽度 * @param scaleX 点的X值相对于图片宽度的比值 * @return */ private float pointImage2ScreenX(int bmW, float scaleX) { return (scaleX * bmW + mRectDes.left - mRectSrc.left) * mWidthScale; } /** * 把相对于图片的高度壁纸转换成相对于屏幕上具体的点 * * @param bmH 图片高度 * @param scaleY 点的Y值相对于图片高度的比值 * @return */ private float pointImage2ScreenY(int bmH, float scaleY) { return (scaleY * bmH + mRectDes.top - mRectSrc.top) * mHeightScale; } /********************画图部分********************/ public MySurfaceView3(Context context, AttributeSet attrs) { super(context, attrs); mSurHolder = getHolder(); mSurHolder.addCallback(this); this.setOnTouchListener(this); } private void init() { mCurrentMaxScale = Math.max(MIN_ZOOM_SCALE, 4 * Math.min(FLOAT_TYPE * mImageHeight / mSurfaceHeight, 1.0f * mImageWidth / mSurfaceWidth)); mCurrentScale = MIN_ZOOM_SCALE; mCenterX = mImageWidth / 2; mCenterY = mImageHeight / 2; initDrawShape(); calcRect(); } private void adjustCenter() { int w = mRectSrc.right - mRectSrc.left; int h = mRectSrc.bottom - mRectSrc.top; if (mCenterX - w / 2 < 0) { mCenterX = w / 2; mRectSrc.left = 0; mRectSrc.right = w; } else if (mCenterX + w / 2 >= mImageWidth) { mCenterX = mImageWidth - w / 2; mRectSrc.right = mImageWidth; mRectSrc.left = mRectSrc.right - w; } else { mRectSrc.left = mCenterX - w / 2; mRectSrc.right = mRectSrc.left + w; } if (mCenterY - h / 2 < 0) { mCenterY = h / 2; mRectSrc.top = 0; mRectSrc.bottom = h; } else if (mCenterY + h / 2 >= mImageHeight) { mCenterY = mImageHeight - h / 2; mRectSrc.bottom = mImageHeight; mRectSrc.top = mRectSrc.bottom - h; } else { mRectSrc.top = mCenterY - h / 2; mRectSrc.bottom = mRectSrc.top + h; } } private float mWidthScale = 1.0f;//当前宽的缩放比例 private float mHeightScale = 1.0f;//当前高的缩放比例 float distanceX; float distancY; private void calcRect() { int w, h; float imageRatio, surfaceRatio; imageRatio = FLOAT_TYPE * mImageWidth / mImageHeight; surfaceRatio = FLOAT_TYPE * mSurfaceWidth / mSurfaceHeight; if (imageRatio < surfaceRatio) { h = mSurfaceHeight; w = (int) (h * imageRatio); } else { w = mSurfaceWidth; h = (int) (w / imageRatio); } if (mCurrentScale > MIN_ZOOM_SCALE) { //如果显示区域超过屏幕宽高,则取屏幕宽高 w = Math.min(mSurfaceWidth, (int) (w * mCurrentScale)); h = Math.min(mSurfaceHeight, (int) (h * mCurrentScale)); } else { mCurrentScale = MIN_ZOOM_SCALE; } String msg = "imageRatio:" + imageRatio + " surfaceRatio:" + surfaceRatio + " mCurrentScale:" + mCurrentScale + " w:" + w + " h:" + h + " mSurfaceWidth:" + mSurfaceWidth + " mSurfaceHeight:" + mSurfaceHeight + " mImageWidth:" + mImageWidth + " mImageHeight:" + mImageHeight; Log.i("TAG radio", msg); mRectDes.left = (mSurfaceWidth - w) / 2; mRectDes.top = (mSurfaceHeight - h) / 2; mRectDes.right = mRectDes.left + w; mRectDes.bottom = mRectDes.top + h; float curImageRatio = FLOAT_TYPE * w / h; int h2, w2; if (curImageRatio > imageRatio) { h2 = (int) (mImageHeight / mCurrentScale); w2 = (int) (h2 * curImageRatio); } else { w2 = (int) (mImageWidth / mCurrentScale); h2 = (int) (w2 / curImageRatio); } mRectSrc.left = mCenterX - w2 / 2; mRectSrc.top = mCenterY - h2 / 2; mRectSrc.right = mRectSrc.left + w2; mRectSrc.bottom = mRectSrc.top + h2; distanceX = (mSurfaceWidth - w) / 2 - (mCenterX - w2 / 2); distancY = (mSurfaceHeight - h) / 2 - (mCenterY - h2 / 2); mWidthScale = w * FLOAT_TYPE / w2;//计算当前宽度缩放比例 mHeightScale = h * FLOAT_TYPE / h2;//计算当前高度缩放比例 } public void setMaxZoom(float value) { mCurrentMaxScale = value; } public void setBitmap(Bitmap b) { if (b == null) { return; } synchronized (MySurfaceView3.class) { mBitmap = b; if (mImageHeight != mBitmap.getHeight() || mImageWidth != mBitmap.getWidth()) { mImageHeight = mBitmap.getHeight(); mImageWidth = mBitmap.getWidth(); init(); } showBitmap(); } } private void showBitmap() { synchronized (MySurfaceView3.class) { Canvas c = getHolder().lockCanvas(); if (c != null && mBitmap != null) { c.drawColor(Color.GRAY); c.drawBitmap(mBitmap, mRectSrc, mRectDes, null); drawShape2Bitmap(c); getHolder().unlockCanvasAndPost(c); } } } private void drawShape2Bitmap(Canvas c) { if (amShape != null && amShape.size() > 0) { for (Data obj : amShape.values()) { shapePaint.setStrokeWidth(obj.getBorderWidth()); shapePaint.setColor(Color.parseColor(obj.getColor2Paint())); switch (obj.getStyle()) { case Data.STYLE_RECTANGLE: sx = pointImage2ScreenX(mImageWidth, obj.getStartPointX()); sy = pointImage2ScreenY(mImageHeight, obj.getStartPointY()); ex = pointImage2ScreenX(mImageWidth, obj.getEndPointX()); ey = pointImage2ScreenY(mImageHeight, obj.getEndPointY()); c.drawRect(sx, sy, ex, ey, shapePaint); break; case Data.STYLE_CIRCLE: //TODO 预留接口画圆 break; } } } //将图片上的点转换为屏幕上的点 if (startX != endX || startY != endY) { sx = pointImage2ScreenX(mImageWidth, startX); sy = pointImage2ScreenY(mImageHeight, startY); ex = pointImage2ScreenX(mImageWidth, endX); ey = pointImage2ScreenY(mImageHeight, endY); c.drawRect(sx, sy, ex, ey, shapePaint); String msg = "mRectSrc:" + mRectSrc.left + "," + mRectSrc.top + "," + mRectSrc.right + "," + mRectSrc.bottom; Log.i("TAG mRectSrc", msg); msg = "mRectDes:" + mRectDes.left + "," + mRectDes.top + "," + mRectDes.right + "," + mRectDes.bottom; Log.i("TAG mRectDes", msg); msg = "pintScale: " + startX + "," + startY + "," + endX + "," + endY; Log.i("TAG pintScale", msg); msg = "point:" + sx + "," + sy + "," + ex + "," + ey; Log.i("TAG point", msg); msg = "bitmap:" + mBitmap.getWidth() + "," + mBitmap.getHeight() + ",放大倍数:" + mCurrentScale + ",mWidthScale:" + mWidthScale + ",mHeightScale:" + mHeightScale; Log.i("TAG bitmap", msg); } } private void dragAction(MotionEvent event) { final int dragScale = 3;//放慢拖动速率 synchronized (MySurfaceView3.class) { PointF currentPoint = new PointF(); currentPoint.set(event.getX(), event.getY()); int offsetX = (int) (currentPoint.x - mStartPoint.x) / dragScale; int offsetY = (int) (currentPoint.y - mStartPoint.y) / dragScale; mStartPoint = currentPoint; mCenterX -= offsetX; mCenterY -= offsetY; adjustCenter(); showBitmap(); } } private void zoomAcition(MotionEvent event) { synchronized (MySurfaceView3.class) { float newDist = spacing(event); float scale = newDist / mStartDistance; mStartDistance = newDist; mCurrentScale *= scale; mCurrentScale = Math.max(FLOAT_TYPE, Math.min(mCurrentScale, mCurrentMaxScale)); calcRect(); adjustCenter(); showBitmap(); } } @Override public boolean onTouch(View v, MotionEvent event) { if (isDrawShape) { if (mRectDes.left > event.getX() || mRectDes.right < event.getX()) { return false; } else if (mRectDes.top > event.getY() || mRectDes.bottom < event.getY()) { return false; } switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = pointScreen2ImageX(mImageWidth, event.getX()); startY = pointScreen2ImageY(mImageHeight, event.getY()); endX = startX; endY = startY; tempShape = new Data(action, style, paintColor, paintWidth); break; case MotionEvent.ACTION_MOVE: endX = pointScreen2ImageX(mImageWidth, event.getX()); endY = pointScreen2ImageY(mImageHeight, event.getY()); break; case MotionEvent.ACTION_UP: endX = pointScreen2ImageX(mImageWidth, event.getX()); endY = pointScreen2ImageY(mImageHeight, event.getY()); tempShape.setStartPoint(startX, startY); tempShape.setEndPoint(endX, endY); if (null != onDrawCompleteListener) { tempShape = onDrawCompleteListener.onDrawCoomplete(tempShape); } amShape.put(tempShape.getId(), tempShape.clone()); break; } showBitmap(); return true; } //缩放部分 switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: mStartPoint.set(event.getX(), event.getY()); mStatus = DRAG; break; case MotionEvent.ACTION_POINTER_DOWN: float distance = spacing(event); if (distance > 10f) { mStatus = ZOOM; mStartDistance = distance; } break; case MotionEvent.ACTION_MOVE: if (mStatus == DRAG) { dragAction(event); } else { if (event.getPointerCount() == 1) return true; zoomAcition(event); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mStatus = NONE; break; } return true; } private float spacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return (float) Math.sqrt(x * x + y * y); } @Override public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub } // 初始化 @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { synchronized (MySurfaceView3.class) { mRectDes.set(0, 0, width, height); mSurfaceHeight = height; mSurfaceWidth = width; init(); if (mBitmap != null) { showBitmap(); } } } @Override public void surfaceDestroyed(SurfaceHolder holder) { } } ``` XML文件代码 ``` <MySurfaceView3 android:id="@+id/calledMsvZoom" android:layout_width="match_parent" android:layout_height="match_parent" /> ```
安卓的视频会议模式中两个大小不同surfaceView如何进行切换?
大神,问一下,我现在做的视频会议里面有两个surfaceView,就跟微信视频一样,如何保证大的surfaceView和小的surfaceView的切换,并且保证画面无断流的,当小的surfaceView切换成大的surfaceView,那个之前那个大的变成小的不能被屏幕覆盖?请各位大神帮忙解决一下,谢谢!
android 双surfaceView分别播放视频及显示图片的方法?
1. surfaceView1 显示图片5秒 2. surfaceView2 播放视频文件(用MediaPlayer方法) 3. surfaceView1 再次显示图片5秒 4. surfaceView2 再次播放视频文件 ,........., surfaceView1, surfaceView2是同一屏幕位置,重叠. 如何实现上面的功能? 需要注意那些问题?
android使用MediaPlayer和SurfaceView播放视频怎样设置按原始比例播放
现在的情况是,视频大小总是铺满SurfaceView,怎样可以在SurfaceView中按照视频本身的比例播放呢
android SurfaceView结束的问题
最近在写一个游戏,使用到了SurfaceView,在绘制时使用while(true)来作为条件,等按返回键程序退出后看log,发现while(true)这个循环仍然为运行,为什么Activity结束的时候这个while(true)还在运行?
SurfaceView 的Layer为什么要在宿主activity的下面呢?
SurfaceView 的Layer为什么要在宿主activity的下面呢?要显示surfaceView还得让activity局部隐藏,这不是很麻烦吗?
Android 如何获取surfaceview上的图片
Android 如何获取surfaceview上的图片 Canvas canvas=holder.lockCanvas(); bitmap=BitmapFactory.decodeResource(getResources(), R.drawable.test); canvas.drawBitmap(bitmap, 0, 0, null); holder.unlockCanvasAndPost(canvas); 然后我会再锁一个区域,将surfaceview上的图片更新,之后想保存更新后的整张surfaceview上的图片,这应该怎么写
安卓 自定义控件SurfaceView
![图片说明](https://img-ask.csdn.net/upload/201507/21/1437491643_317894.png)
在android中用surfaceview播放视频时,实现未播放的预览效果?
在android中用surfaceview播放视频时,如何在surfaceview的出现时就加载视频的第一帧,实现未播放的预览效果? 类似于图的那种效果,谁有什么解决方法吗?
surfaceView的透明问题
**问题描述:** 一个Activity布局文件,最外层是RelativeLayout,包含以下三个layout,依次摆放,第一层是RelativeLayout1,第二层是surfaceView,第三层是RelativeLayout2,互相重叠.。该Actitity被设置成了透明,surfaceView也被设置成了透明,最上面一层RelativeLayout2也是透明的,可是在surface下面一层的RelativeLayout1却看不到,看到的是手机桌面,请问为什么,有什么解决方法吗? ![图片说明](https://img-ask.csdn.net/upload/201501/15/1421317172_635864.png)
surfaceview写的字被掩盖
surfaceview有个drawtext方法,但是在画了图片后它所写的字会被图片所掩盖,怎么让字显示在图片上面
surfaceview与activity的数据传递
我在surfaceview中有个int数据,我想把它传递到另一个activity类中,应该怎么做,求大神指教
Android surfaceView播放视频 如何计算视频的帧率
求助大佬 Android surfaceView播放视频 如何计算视频的帧率 ``` SurfaceHolder surfaceHolder = surfaceView.getHolder(); surfaceHolder.addCallback(new SurfaceHolder.Callback() { @Override public void surfaceCreated(SurfaceHolder holder) { NativeSetSurface(mStreamId, holder.getSurface()); //播放视频 } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @Override public void surfaceDestroyed(SurfaceHolder holder) { holder = null; surfaceView.destroyDrawingCache(); NativeSetSurface(mStreamId,null); } }); ```
如何在切换Fragment时不销毁SurfaceView
如题,我创建了两个Fragment,其中一个加载了SurfaceView,然而每次切换Fragment的时候,log都会提示SurfaceView的surfaceDestroyed被调用了,再切回来的时候提示surfaceCreated被调用,结果就是切换回含有SurfaceView的Fragment的时候就黑一下屏。我觉得跟SurfaceView在切换时被销毁重建有关,那么该如何解决呢?
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
将代码部署服务器,每日早上定时获取到天气数据,并发送到邮箱。 也可以说是一个小人工智障。 思路可以运用在不同地方,主要介绍的是思路。
Linux(服务器编程):15---两种高效的事件处理模式(reactor模式、proactor模式)
前言 同步I/O模型通常用于实现Reactor模式 异步I/O模型则用于实现Proactor模式 最后我们会使用同步I/O方式模拟出Proactor模式 一、Reactor模式 Reactor模式特点 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将时间通知工作线程(逻辑单元)。除此之外,主线程不做任何其他实质性的工作 读写数据,接受新的连接,以及处...
为什么要学数据结构?
一、前言 在可视化化程序设计的今天,借助于集成开发环境可以很快地生成程序,程序设计不再是计算机专业人员的专利。很多人认为,只要掌握几种开发工具就可以成为编程高手,其实,这是一种误解。要想成为一个专业的开发人员,至少需要以下三个条件: 1) 能够熟练地选择和设计各种数据结构和算法 2) 至少要能够熟练地掌握一门程序设计语言 3) 熟知所涉及的相关应用领域的知识 其中,后两个条件比较容易实现,而第一个...
C语言魔塔游戏
很早就很想写这个,今天终于写完了。 游戏截图: 编译环境: VS2017 游戏需要一些图片,如果有想要的或者对游戏有什么看法的可以加我的QQ 2985486630 讨论,如果暂时没有回应,可以在博客下方留言,到时候我会看到。 下面我来介绍一下游戏的主要功能和实现方式 首先是玩家的定义,使用结构体,这个名字是可以自己改变的 struct gamerole { char n
进程通信方式总结与盘点
​ 进程通信是指进程之间的信息交换。这里需要和进程同步做一下区分,进程同步控制多个进程按一定顺序执行,进程通信是一种手段,而进程同步是目标。从某方面来讲,进程通信可以解决进程同步问题。 ​ 首先回顾下我们前面博文中讲到的信号量机制,为了实现进程的互斥与同步,需要在进程间交换一定的信息,因此信号量机制也可以被归为进程通信的一种方式,但是也被称为低级进程通信,主要原因为: 效率低:一次只可操作少量的...
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
听说了吗?阿里双11作战室竟1根网线都没有
双11不光是购物狂欢节,更是对技术的一次“大考”,对于阿里巴巴企业内部运营的基础保障技术而言,亦是如此。 回溯双11历史,这背后也经历过“小米加步枪”的阶段:作战室从随处是网线,交换机放地上的“一地狼藉”;到如今媲美5G的wifi网速,到现场却看不到一根网线;从当年使用商用AP(无线路由器),让光明顶双11当天断网一分钟,到全部使用阿里自研AP……阿里巴巴企业智能事业部工程师们提供的基础保障...
在阿里,40岁的奋斗姿势
在阿里,40岁的奋斗姿势 在阿里,什么样的年纪可以称为老呢?35岁? 在云网络,有这样一群人,他们的平均年龄接近40,却刚刚开辟职业生涯的第二战场。 他们的奋斗姿势是什么样的呢? 洛神赋 “翩若惊鸿,婉若游龙。荣曜秋菊,华茂春松。髣髴兮若轻云之蔽月,飘飖兮若流风之回雪。远而望之,皎若太阳升朝霞;迫而察之,灼若芙蕖出渌波。” 爱洛神,爱阿里云 2018年,阿里云网络产品部门启动洛神2.0升...
关于研发效能提升的思考
研发效能提升是最近比较热门的一个话题,本人根据这几年的工作心得,做了一些思考总结,由于个人深度有限,暂且抛转引入。 三要素 任何生产力的提升都离不开这三个因素:人、流程和工具,少了其中任何一个因素都无法实现。 人,即思想,也就是古人说的“道”,道不同不相为谋,是制高点,也是高层建筑的基石。 流程,即方法,也是古人说的“法”。研发效能的提升,也就是要提高投入产出比,既要增加产出,也要减...
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆  每天早上8:30推送 作者| Mr.K   编辑| Emma 来源| 技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯
程序员该看的几部电影
##1、骇客帝国(1999) 概念:在线/离线,递归,循环,矩阵等 剧情简介: 不久的将来,网络黑客尼奥对这个看似正常的现实世界产生了怀疑。 他结识了黑客崔妮蒂,并见到了黑客组织的首领墨菲斯。 墨菲斯告诉他,现实世界其实是由一个名叫“母体”的计算机人工智能系统控制,人们就像他们饲养的动物,没有自由和思想,而尼奥就是能够拯救人类的救世主。 可是,救赎之路从来都不会一帆风顺,到底哪里才是真实的世界?
入职阿里5年,他如何破解“技术债”?
简介: 作者 | 都铎 作为一名技术人,你常常会听到这样的话: “先快速上线” “没时间改” “再缓一缓吧” “以后再解决” “先用临时方案处理” …… 当你埋下的坑越来越多,不知道哪天哪位同学就会踩上一颗雷。特别赞同“人最大的恐惧就是未知,当技术债可说不可见的时候,才是最让人不想解决的时候。” 作为一个程序员,我们反对复制粘贴,但是我们经常会见到相似的代码,相同的二方包,甚至整个代码...
Python绘图,圣诞树,花,爱心 | Turtle篇
每周每日,分享Python实战代码,入门资料,进阶资料,基础语法,爬虫,数据分析,web网站,机器学习,深度学习等等。 公众号回复【进群】沟通交流吧,QQ扫码进群学习吧 微信群 QQ群 1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle()...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布了 2019年国民经济报告 ,报告中指出:年末中国大陆总人口(包括31个
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
2020年的1月,我辞掉了我的第一份工作
其实,这篇文章,我应该早点写的,毕竟现在已经2月份了。不过一些其它原因,或者是我的惰性、还有一些迷茫的念头,让自己迟迟没有试着写一点东西,记录下,或者说是总结下自己前3年的工作上的经历、学习的过程。 我自己知道的,在写自己的博客方面,我的文笔很一般,非技术类的文章不想去写;另外我又是一个还比较热衷于技术的人,而平常复杂一点的东西,如果想写文章写的清楚点,是需要足够...
别低估自己的直觉,也别高估自己的智商
所有群全部吵翻天,朋友圈全部沦陷,公众号疯狂转发。这两周没怎么发原创,只发新闻,可能有人注意到了。我不是懒,是文章写了却没发,因为大家的关注力始终在这次的疫情上面,发了也没人看。当然,我...
Java坑人面试题系列: 包装类(中级难度)
Java Magazine上面有一个专门坑人的面试题系列: https://blogs.oracle.com/javamagazine/quiz-2。 这些问题的设计宗旨,主要是测试面试者对Java语言的了解程度,而不是为了用弯弯绕绕的手段把面试者搞蒙。 如果你看过往期的问题,就会发现每一个都不简单。 这些试题模拟了认证考试中的一些难题。 而 “中级(intermediate)” 和 “高级(ad
深度学习入门笔记(十八):卷积神经网络(一)
欢迎关注WX公众号:【程序员管小亮】 专栏——深度学习入门笔记 声明 1)该文章整理自网上的大牛和机器学习专家无私奉献的资料,具体引用的资料请看参考文献。 2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。 3)博主才疏学浅,文中如有不当之处,请各位指出,共同进步,谢谢。 4)此属于第一版本,若有错误,还需继续修正与...
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。 再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。 下文是原回答,希望能对你能有所启发。 如果我说,这个世界上人真的分三六九等,...
节后首个工作日,企业们集体开晨会让钉钉挂了
By 超神经场景描述:昨天 2 月 3 日,是大部分城市号召远程工作的第一天,全国有接近 2 亿人在家开始远程办公,钉钉上也有超过 1000 万家企业活跃起来。关键词:十一出行 人脸...
Java基础知识点梳理
Java基础知识点梳理 摘要: 虽然已经在实际工作中经常与java打交道,但是一直没系统地对java这门语言进行梳理和总结,掌握的知识也比较零散。恰好利用这段时间重新认识下java,并对一些常见的语法和知识点做个总结与回顾,一方面为了加深印象,方便后面查阅,一方面为了学好java打下基础。 Java简介 java语言于1995年正式推出,最开始被命名为Oak语言,由James Gosling(詹姆
2020年全新Java学习路线图,含配套视频,学完即为中级Java程序员!!
新的一年来临,突如其来的疫情打破了平静的生活! 在家的你是否很无聊,如果无聊就来学习吧! 世上只有一种投资只赚不赔,那就是学习!!! 传智播客于2020年升级了Java学习线路图,硬核升级,免费放送! 学完你就是中级程序员,能更快一步找到工作! 一、Java基础 JavaSE基础是Java中级程序员的起点,是帮助你从小白到懂得编程的必经之路。 在Java基础板块中有6个子模块的学
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
你也能看懂的:蒙特卡罗方法
蒙特卡罗方法,也称统计模拟方法,是1940年代中期由于科学技术的发展和电子计算机的发明,而提出的一种以概率统计理论为指导的数值计算方法。是指使用随机数(或更常见的伪随机数)来解决很多计算问题的方法 蒙特卡罗方法可以粗略地分成两类:一类是所求解的问题本身具有内在的随机性,借助计算机的运算能力可以直接模拟这种随机的过程。另一种类型是所求解问题可以转化为某种随机分布的特征数,比如随机事件出现的概率,或...
相关热词 c# 识别回车 c#生成条形码ean13 c#子控制器调用父控制器 c# 写大文件 c# 浏览pdf c#获取桌面图标的句柄 c# list反射 c# 句柄 进程 c# 倒计时 线程 c# 窗体背景色
立即提问