引导页 聚焦效果

引导页 聚焦效果

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

偶尔在知乎上看到 豌豆荚工作氛围和企业文化都比較好,有归属感,多写写博客,希望能被豌豆荚发现大笑。

如题,引导页 聚焦效果,用于标注某个区域的功能,假设感觉有点意思,请给个赞。如图:

引导页 聚焦效果

设计思路:

1、得到想聚焦View的位置location;

2、遮罩层(一个圆圈,其它地方半透),用SurfaceView实现,包括两张图片,一张圆形,一张半透的方形。

引导页 聚焦效果      引导页 聚焦效果

先在Canvas上画出镂空圆孔,然后在该圆形图片的上下左右4个矩形区域画上那张半透的方形图片,就组成了遮罩层;

3、依照View的location,能够计算得到圆形图片的位置;

4、监听遮罩层的OnTouch事件,每次touch,将依据下一个locaton,重绘SurfaceView;

5、当没有下一个location时,再次点击,遮罩层消失。

源代码分析:

包括3部分,GuideIndexActivity.java、GuideView.java、MainActivity.java。

注:可改动去掉GuideIndexActivity.java,将GuideView在Activity中显示。

MainActivity.java:

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	public void showGuide(View v) {
		Button hereBtn = (Button) findViewById(R.id.btn_here);
		TextView godlikeTv = (TextView) findViewById(R.id.tv_godlike);
		ImageView launcherIv = (ImageView) findViewById(R.id.iv_launcher);
		Intent intent = new Intent(MainActivity.this, GuideIndexActivity.class);

		intent.putExtra("ArrayPoints",
				guidePoints(hereBtn, godlikeTv, launcherIv));
		startActivity(intent);
	}
	
	private String guidePoints(View... views) {
		int size = views.length;
		JSONArray array = new JSONArray();
		for (int i = 0; i < size; i++) {
			array.put(viewPoint(views[i]));
		}
		return array.toString();
	}
	
	private JSONObject viewPoint(View view) {
		JSONObject json = new JSONObject();
		int[] location = new int[2];
		view.getLocationOnScreen(location);
		try {
				json.put("x", location[0] + view.getWidth() / 2);
				json.put("y", location[1] + view.getHeight() / 2);
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return json;
	}
}


JSONObject viewPoint(View view) 获取到某View的位置。

String guidePoints(View… views)  将全部的View的位置信息转为JSONArray字符串。

GuideView.java:

public class GuideView extends SurfaceView implements SurfaceHolder.Callback {
	private SurfaceHolder holder;
	private Bitmap focus = BitmapFactory.decodeResource(getResources(),
			R.drawable.bg_guide_focus);
	private Bitmap bg = BitmapFactory.decodeResource(getResources(),
			R.drawable.bg_guide);
	private float focusW, focusH;
	private Context mContext;
	private int ScreenWidth;
	private int ScreenHeight;
	private JSONArray arrayPoints;
	private int step = 0;
	private boolean flag = false;

	public GuideView(Context context) {
		super(context);
		this.mContext = context;
		this.focusH = focus.getHeight();
		this.focusW = focus.getWidth();
		this.holder = this.getHolder();
		Display mDisplay = ((Activity) context).getWindowManager()
				.getDefaultDisplay();
		ScreenWidth = mDisplay.getWidth();
		ScreenHeight = mDisplay.getHeight();
		holder.addCallback(this);
		getHolder().setFormat(PixelFormat.TRANSLUCENT);
	}

	public GuideView(Context context, AttributeSet attributeSet) {
		super(context, attributeSet);
		this.mContext = context;
		this.focusH = focus.getHeight();
		this.focusW = focus.getWidth();
		this.holder = this.getHolder();
		Display mDisplay = ((Activity) context).getWindowManager()
				.getDefaultDisplay();
		ScreenWidth = mDisplay.getWidth();
		ScreenHeight = mDisplay.getHeight();
		holder.addCallback(this);
		getHolder().setFormat(PixelFormat.TRANSLUCENT);
	}

	public void setArrayPoint(JSONArray arrayPoints) {
		this.setVisibility(View.VISIBLE);
		this.arrayPoints = arrayPoints;
		flag = true;
		invalidate();
	}

	@Override
	public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) {
		// TODO Auto-generated method stub

	}

	@Override
	public void surfaceCreated(SurfaceHolder arg0) {
		// TODO Auto-generated method stub
		if (flag) {
			doDraw(step);
		}
	}

	@Override
	public void surfaceDestroyed(SurfaceHolder arg0) {
		// TODO Auto-generated method stub
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		if (flag) {
			if (step <= arrayPoints.length()) {
				doDraw(step);
			} else {
				((Activity) mContext).finish();
				focus.recycle();
				bg.recycle();
			}
		}
		return super.onTouchEvent(event);
	}

	private void doDraw(int step) {
		// TODO Auto-generated method stub
		Canvas canvas = getHolder().lockCanvas();
		canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
		Rect src = new Rect(0, 0, bg.getWidth(), bg.getHeight());
		if(step < arrayPoints.length()){
		Point point = new Point();
		try {
			JSONObject json = arrayPoints.getJSONObject(step);
			point.x = json.getInt("x");
			point.y = json.getInt("y");
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		int left = (int) (point.x - focusW / 2);
		int top = (int) (point.y - focusH / 2);
		int right = (int) (left + focusW);
		int bottom = (int) (top + focusH);
		canvas.drawBitmap(focus, left, top, null);
		Rect dstTop = new Rect(0, 0, ScreenWidth, top);
		Rect dstBottom = new Rect(0, bottom, ScreenWidth, ScreenHeight);
		Rect dstLeft = new Rect(0, top, left, bottom);
		Rect dstRight = new Rect(right, top, ScreenWidth, bottom);
		canvas.drawBitmap(bg, src, dstTop, null);
		canvas.drawBitmap(bg, src, dstBottom, null);
		canvas.drawBitmap(bg, src, dstLeft, null);
		canvas.drawBitmap(bg, src, dstRight, null);
		switch (step) {
		case 0:
			// first to do something
			break;
		case 1:
			// second to do something
			break;
		case 2:
			// third to do something
			break;
		default:
			break;
		}
		}else if(step == 3){
			
		}
		this.step++;
		getHolder().unlockCanvasAndPost(canvas);
	}

	class Point {
		int x;
		int y;
	}

GuideIndexActivity.java:

public class GuideIndexActivity extends Activity{
	private GuideView guideView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		guideView = new GuideView(this);
		setContentView(guideView);
	}
	
	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		JSONArray arrayPoints;
		try {
			arrayPoints = new JSONArray(getIntent().getStringExtra("ArrayPoints"));
			guideView.setArrayPoint(arrayPoints);
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		super.onResume();
	}
}

源代码下载地址:
http://download.csdn.net/detail/toyuexinshangwan/7603509

转载请标明:
http://blog.csdn.net/toyuexinshangwan/article/details/37508619

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/118348.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • JAVA获取服务器上文件路径,java 获取远程服务器目录的路径

    JAVA获取服务器上文件路径,java 获取远程服务器目录的路径java获取远程服务器目录的路径内容精选换一换已将所需升级的鲲鹏性能分析工具的软件包下载到本地。获取软件包后,需要校验软件包,确保与网站上的原始软件包一致,详细步骤请参见软件包校验。获取软件包后,需要校验软件包,确保与网站上的原始软件包一致,详细步骤请参见软件包校验。升级前请确认鲲鹏性能分析工具可以正常使用。升级前请确认安装空间至少保留原工具安装目录的大小加上新版本安装空间(1GB)为加强对系…

    2022年7月11日
  • Java IO流学习总结七:Commons IO 2.5-FileUtils

    Java IO流学习总结七:Commons IO 2.5-FileUtilsJavaIO流学习总结七:CommonsIO2.5转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/54946762本文出自【赵彦军的博客】在上面的几篇文章中,介绍了IO的常规用法,今天介绍CommonsIO框架的使用。CommonsIO简介ApacheCommonsIO是Apache基金会创建并维护的Ja

    2022年5月18日
  • 5节锂电池升压充电管理芯片型号_锂电池充电管理ic

    5节锂电池升压充电管理芯片型号_锂电池充电管理ic5V升压充电21V五节锂电池升压充电管理芯片HU5911是一款工作于2.7V到6.5V的PFM升压型多节电池充电控制集成电路。HU5911采用恒流和准恒压模式(Quasi-CVTM)对电池进行充电管理,内部集成有基准电压源,电感电流检测单元,控制电路和片外场效应晶体管驱动电路等,具有外部元件少,电路简单等优点。当接通输入电源后,HU5911进入充电状态,控制片外N沟道MOSFET导通,电感电流上升,当上升到外部电流检测电阻设置的上限时,片外N沟道MOSFET截止,电感电流下降,电感中的能量转移到电池中

    2022年9月28日
  • 4月idea激活码_通用破解码「建议收藏」

    4月idea激活码_通用破解码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
  • 条件运算符

    条件运算符条件运算符也叫三元运算符语法:条件表达式?语句1:语句2;条件运算符是ECMAScript中功能最多的运算符,它的形式与Java中的相同。variable=boolean_expre

    2022年7月2日
  • STM32编程怎么入门,聊聊我的入门经历

    STM32编程怎么入门,聊聊我的入门经历我第一次接触STM32大概是在8,9年前。当时刚出来工作不久,在此之前主要用stc和nxp的单片机比较多。那个时候还没有固件库开发的概念,基本都是配置寄存器去使用单片机外设资源。虽然说用起来比较麻烦,但是执行的效率也相对高一点,习惯了也挺好用。新项目比较复杂一点,一个老工程师建议我用stm32的单片机做效率比较高。听大佬的话照做是一个小菜鸟的基本素养,所以我选了stm32。对于学习这块,我也比较舍得(当时月薪只有1.8K),毫不犹豫花了几百大洋购买了一套stm32开发板。学习一款

    2022年9月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号