19_B门长时曝光APP
知识很基础……
前几天买了个单反,特别想拍B门长时间曝光的效果。后来想想不如自己写个APP,实现屏幕背景的随机颜色以及全屏显示文字。
先上图:
这两张图片的左侧都很亮,这是因为APP里面忘记把"状态栏"隐藏了。两张照片的快门都是30s,APP的基本功能就是设定好文字,点击屏幕就会显示一个字;再点击屏幕编程黑色;再次点击屏幕出现下一个字。我在屏幕全黑的时候移动手机,到合适位置点击屏幕,显示出下一个字。同时屏幕还能够按照设定的时间间隔,显示出随机的颜色。为了使显示的颜色更鲜艳,在RGB颜色合成的时候,RGB的随机值都是从80~255。
同时文字在显示的时候,角度从45°到135°随机出现,这要在拍照时手机正常摆放,也不至于太过呆板。
下面是APP截图:
运行时的截图:
程序代码如下:
package com.example.raw; import java.util.Timer;
import java.util.TimerTask; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView; public class MainActivity extends Activity { public int redColor = 0;
public int blueColor = 0;
public int greenColor = 0; public int tvRedColor = 0;
public int tvBlueColor = 0;
public int tvGreenColor = 0; public int tvRotation = 0;
public int clickTimes = 0;
public int i = 0; public char[] text = null; public boolean enableView = false; private LinearLayout ll;
private TimerTask task;
private Button btnTimeInterval, btnSetText;
private TextView etTimeInterval, editSetText, tvFullScreen, tvScreenLight;
private SeekBar seekBar; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main); seekBar = (SeekBar) findViewById(R.id.seekBar);
seekBar.setMax(100); seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub } public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub } public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.screenBrightness = (float) (progress / 100.0);
getWindow().setAttributes(lp);
}
}); ll = (LinearLayout) findViewById(R.id.root);
ll.setBackgroundColor(0XFFFFFFFF); btnTimeInterval = (Button) findViewById(R.id.btnTimeInterval);
btnSetText = (Button) findViewById(R.id.btnSetText); etTimeInterval = (TextView) findViewById(R.id.etTimeInterval);
editSetText = (TextView) findViewById(R.id.editSetText);
tvFullScreen = (TextView) findViewById(R.id.tvFullScreen);
tvScreenLight = (TextView) findViewById(R.id.tvScreenLight); final Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
redColor = (int) (80 + Math.random() * 175);
blueColor = (int) (80 + Math.random() * 175);
greenColor = (int) (80 + Math.random() * 175);
ll.setBackgroundColor(0xff000000 + redColor * 255 * 255
+ blueColor * 255 + greenColor);
break;
default:
break;
}
super.handleMessage(msg);
}
}; btnTimeInterval.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try {
if (etTimeInterval.getText() != null) {
setAllUiVisibilityGone();
tvFullScreen.setVisibility(8);
Timer timer = new Timer(true);
timer.schedule(task, 1000, Integer
.parseInt(etTimeInterval.getText().toString()));
} } catch (Exception e) { } }
}); btnSetText.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { try {
if (editSetText.getText() != null) {
setAllUiVisibilityGone();
text = editSetText.getText().toString().toCharArray();
tvFullScreen.setBackgroundColor(0xff000000);
ll.setBackgroundColor(0xff000000);
enableView = true;
} } catch (Exception e) {
// TODO: handle exception
}
}
}); ll.setOnClickListener(new View.OnClickListener() { public void onClick(View v) {
if (enableView == true) {
clickTimes++;
if (clickTimes % 2 == 1) {
tvFullScreen.setBackgroundColor(0xff000000);
ll.setBackgroundColor(0xff000000); tvRotation = (int) (45 + Math.random() * 90);
tvFullScreen.setRotation(tvRotation); tvRedColor = (int) (100 + Math.random() * 155);
tvBlueColor = (int) (100 + Math.random() * 155);
tvGreenColor = (int) (100 + Math.random() * 155);
tvFullScreen.setTextColor(0xff000000 + tvRedColor * 255
* 255 + tvBlueColor * 255 + tvGreenColor); if (i < text.length) {
tvFullScreen.setText(text, i++, 1);
} else {
tvFullScreen.setTextColor(0xff000000);
} } else {
tvFullScreen.setBackgroundColor(0xff000000);
tvFullScreen.setTextColor(0xff000000);
ll.setBackgroundColor(0xff000000);
}
}
}
}); task = new TimerTask() { @Override
public void run() {
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
}; } public void setAllUiVisibilityGone() {
btnTimeInterval.setVisibility(8);
etTimeInterval.setVisibility(8);
btnSetText.setVisibility(8);
editSetText.setVisibility(8);
seekBar.setVisibility(8);
tvScreenLight.setVisibility(8);
}
}
MainActivity
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffffff"
android:orientation="vertical"
tools:context="com.example.raw.MainActivity" > <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <EditText
android:id="@+id/etTimeInterval"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:ems="10"
android:hint="输入时间间隔"
android:inputType="numberDecimal" > <requestFocus />
</EditText> <Button
android:id="@+id/btnTimeInterval"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="设定间隔" />
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <EditText
android:id="@+id/editSetText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2"
android:ems="10"
android:hint="输入文字" /> <Button
android:id="@+id/btnSetText"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="3"
android:text="设定文字" />
</LinearLayout> <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <SeekBar
android:id="@+id/seekBar"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="2" /> <TextView
android:id="@+id/tvScreenLight"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="屏幕亮度"
android:layout_weight="3"
android:gravity="center"
android:textSize="20sp"/>
</LinearLayout> <TextView
android:id="@+id/tvFullScreen"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:gravity="center"
android:text=""
android:textSize="280sp" /> </LinearLayout>
XML文件
19_B门长时曝光APP的更多相关文章
- 背水一战 Windows 10 (104) - 通知(Toast): 纯文本 toast, 短时 toast, 长时 toast, 图文 toast
[源码下载] 背水一战 Windows 10 (104) - 通知(Toast): 纯文本 toast, 短时 toast, 长时 toast, 图文 toast 作者:webabcd 介绍背水一战 ...
- html中使用js实现内容过长时部分
有时数据内容太长时我们并不希望其全部显示出来,因为这样可能会导致用于显示这些内容的标签被撑开影响美观. 这时就希望能够实现默认只显示部分内容,在鼠标放上去的时候再将全部的内容显示出来. 这里提供一个简 ...
- iOS设置文字过长时的显示格式
以label为例: //设置文字过长时的显示格式 aLabel.lineBreakMode = UILineBreakModeMiddleTruncation; //截去中间 aLabel.lineB ...
- HTML中文本过长时自动隐藏末尾部分或中间等任意部分
一. 一般情况下,HTML字符串过长时都会将超过的部分隐藏点,方法如下: 设置CSS: .ellipsis-type{ max-width: 50px; ...
- c# c/s 框架读取的配置文件时是app.exe.config
c# c/s 框架读取的配置文件时是app.exe.config, 一般在bin中间中俄debug中或者Release中
- echarts pie 图表当名称太长时
当饼图的名称太长时,只显示几个字符,其余的... let use; use.setOption({ tooltip: { trigger: 'item', formatter: "{a} & ...
- 返回xml过长时被nginx截断的解决办法
返回xml过长时被nginx截断的解决办法 问题描述:通过网页获取数据,数据格式为xml.当xml比较短时,可以正常获取数据.但是xml长度过长时不能正常获取数据,通过观察返回数据的源代码,发现xml ...
- UILabel标签文字过长时的显示方式
lineBreakMode:设置标签文字过长时的显示方式. label.lineBreakMode = NSLineBreakByCharWrapping; //以字符为显示单位显示,后面部分省略不显 ...
- 当td中文字过长时,显示为省略号
当表格中的文字过长时,可选择已省略号显示.这里是用js实现的.首先获取td中的文字长度(innerText.length),如果长度超过了设定的长度,则截取内容,加上省略号显示.示例代码如下: $(f ...
随机推荐
- elk部署(实操二)
续上篇 https://www.cnblogs.com/wangql/p/13373022.html 安装logstash 下载地址:wget https://artifacts.elastic.c ...
- Java学习的第四十二天
1.例4.7弦截法求方程f(x)=x^3-5x^2+16x-80=0的根 import java.util.Scanner; import java.lang.*; public class cjav ...
- [Luogu P4173]残缺的字符串 ( 数论 FFT)
题面 传送门:洛咕 Solution 这题我写得脑壳疼,我好菜啊 好吧,我们来说正题. 这题.....emmmmmmm 显然KMP类的字符串神仙算法在这里没法用了. 那咋搞啊(或者说这题和数学有半毛钱 ...
- java常用类——包装类
八种基本数据类型对应八种包装类和它们的继承关系 基本数据类型 对应的包装类 boolean Boolean byte Byte short Short int Integer long Long ch ...
- Markdown tricks
编辑排版 仅仅了解 Markdown 语法还不够,知道这些 排版技巧 增色您的文章内容. 空格和空行 留白,从艺术角度上说,留白就是以"空白"为载体进而渲染出美的意境的艺术.从应用 ...
- 中科图新成为Bentley产品培训合作伙伴!质量服务双升级
中科图新从2016年起开办ContextCapture产品培训,目前已累计培训了500多家企事业单位,涉及传统测绘单位.无人机航测.规划设计.建筑工程.水利.电力.交通.文保等十多个行业.实力过硬,口 ...
- kudu1.10基于cdh6.3.1搭建
1.下载kudu依赖: yum -y install cyrus-sasl-plain ntp 2.下载kudu rpm包: wget https://archive.cloudera.com/c ...
- linux 内存泄露 valgrind
内泄漏工具 valgrind: https://linux.die.net/man/1/valgrind www.valgrind.org/docs/manual/index.html www.val ...
- 使用GitHub API上传文件及GitHub做图床
本文介绍GitHub API基础及上传文件到仓库API,并应用API将GitHub作为图床 GitHub API官方页面 GitHub API版本 当前版本为v3,官方推荐在请求头中显示添加版本标识. ...
- cephfs删除报nospace的问题
ceph Vol 45 Issue 2 CephFS: No space left on device After upgrading to 10.2.3 we frequently see mess ...