HOME
  Security
   Software
    Hardware
  
FPGA
  CPU
   Android
    Raspberry Pi
  
nLite
  Xcode
   etc.
    ALL
  
LINK
BACK
 

2016/12/26

Xcode SWIFTで Mac OSX用のスクリーンマスコットアプリを作る Xcode SWIFTで Mac OSX用のスクリーンマスコットアプリを作る

(Mac OS X用アプリを Swift言語で作る方法、デスクトップ画面に画像をオーバーレイで描画する方法)

Tags: [Apple], [MacBook]




● Xcode 7.3.1 Swift 2.2.1で OS X用のアプリを作る

・CatAndDogRun 猫と犬 走る デスクトップ常駐マスコットアプリ for Mac OSX
CatAndDogRun 猫と犬 走る デスクトップ常駐マスコットアプリ for Mac OSX



・「Android CatAndDogRun 猫と犬 走る スマホ初!ステータスバー常駐 マスコット アプリ!」の猫の画像(フリー素材
「Android CatAndDogRun 猫と犬 走る スマホ初!ステータスバー常駐 マスコット アプリ!」の猫の画像(フリー素材



Welcome to Swift.org

 ここでは、Xcode 7.3.1 Swift 2.2.1を使用してアプリを作ります。


●必要な実装処理内容の一覧

 主な実装処理
 ・画面のサイズを取得する
 ・透明なウィンドウを作成する(Windowの背景を透過する)
 ・透明なウィンドウを前面に配置(スクリーンセーバーと同じ Zオーダーに描画する)
 ・透明なウィンドウでクリック等の UI操作を無効にする(マウス操作を無効化)
 ・Windowのタイトルバーを非表示にする
 ・描画内容全体を半透明化する
 ・リソースに定義した画像を NSImageに読み込む
 ・画像の一部分を切り出して指定範囲に描画する
 ・Windowを最前面に表示
 ・画像をアスペクト比を保持して拡大縮小して表示する
 ・一定間隔で画像描画を更新する(アニメーションさせる)
 ・NSImageを CGImageに変換する
 (NSナントカの NSは NeXTSTEPの略)
 (CGナントカの CGは Core Graphicsの略)

 サンプルのアニメ画像として「Android CatAndDogRun 猫と犬 走る スマホ初!ステータスバー常駐 マスコット アプリ!」の猫の画像(フリー素材)を使用します。

2011/10/08
Android CatAndDogRun 猫と犬 走る スマホ初!ステータスバー常駐 マスコット アプリ!
Android CatAndDogRun 猫と犬 走る スマホ初!ステータスバー常駐 マスコット アプリ!

  Cat and Dog Run 猫と犬が画面に常駐して走る癒し系ジョークアプリです。

 (本当は Mac GoGoのねーちゃん画像をと思ったが自主規制した。)
・「Android CatAndDogRun 猫と犬 走る スマホ初!ステータスバー常駐 マスコット アプリ!」の猫の画像(フリー素材
「Android CatAndDogRun 猫と犬 走る スマホ初!ステータスバー常駐 マスコット アプリ!」の猫の画像(フリー素材



 猫の画像は 6枚のアニメーション画像を 1枚に結合しています。
 アプリで描画する際は 6分割してその 1区画を抜き出してタイマーで描画します。

 上下左右に動く様にすれば「Android 東方Projectのキャラクタが勢揃いしてスマートフォンのステータスバーや画面内を歩きます」も作れます。

2011/10/05
Android 東方Projectのキャラクタが勢揃いしてスマートフォンのステータスバーや画面内を歩きます
Android 東方Projectのキャラクタが勢揃いしてスマートフォンのステータスバーや画面内を歩きます

  シューティング ゲームの東方Projectのキャラクタがアンドロイド携帯を歩く常駐マスコット アプリ

//  Copyright (c) 2016 FREE WING,Y.Sakamoto. All rights reserved.

import Cocoa

@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {

	@IBOutlet weak var window: NSWindow!

	var displaySize: NSRect? = nil
	var pitchX: CGFloat = 0.0;
	var imageView: NSImageView? = nil

	var viewWidth: CGFloat = 0
	var viewHeight: CGFloat = 0

	var image: NSImage? = nil
	var imageWidth: CGFloat = 0
	var imageHeight: CGFloat = 0
	var imagePosition = 0

	// アニメーションパターンの数(画像連結数)
	let numberOfImage = 6

	// アプリ開始時の処理
	func applicationDidFinishLaunching(aNotification: NSNotification) {
		// Insert code here to initialize your application

		initializeWindow()

		imagePosition = 0

// ・一定間隔で画像描画を更新する(アニメーションさせる)
		// 60ms間隔で実行(アニメーション間隔)
		NSTimer.scheduledTimerWithTimeInterval(0.06, target: self, selector: #selector(AppDelegate.updateImageView), userInfo: nil, repeats: true)
	}

	// アプリ終了時の処理
	func applicationWillTerminate(aNotification: NSNotification) {
		// Insert code here to tear down your application
	}

	// 初期化
	func initializeWindow()
	{

// ・画面のサイズを取得する
		// visibleFrame = 1326, 745
		displaySize = NSScreen.mainScreen()?.visibleFrame
		// frame = 1366, 768
		displaySize = NSScreen.mainScreen()?.frame
		Swift.print(String(format: "displaySize %4.0lf %4.0lf", displaySize!.width, displaySize!.height))

// ・Windowのタイトルバーを非表示にする
		// Windowのタイトルバーを非表示にする(xibで設定する)
 //		window.titleVisibility = NSWindowTitleVisibility.Hidden

// ・透明なウィンドウを作成する(Windowの背景を透過する)
		// Window背景を透過するおまじない
		window.opaque = false
		// Window背景を透過する
		window.backgroundColor = NSColor.clearColor()

// ・透明なウィンドウを前面に配置(スクリーンセーバーと同じ Zオーダーに描画する)
		// Window Layers and Levels
		// Z orderを Screen Saverと同じにする
		window.level = Int(CGWindowLevelForKey(CGWindowLevelKey.ScreenSaverWindowLevelKey))

// ・描画内容全体を半透明化する
		// タイトルバーを含む全体を半透明
		window.alphaValue = CGFloat(0.7)

// ・透明なウィンドウでクリック等の UI操作を無効にする(マウス操作を無効化)
		// マウス操作を無効(表示するだけで UI操作を妨害しない)
		window.ignoresMouseEvents = true

 //		// マウス操作で動かせる様にする
 //		window.movableByWindowBackground = true

// ・リソースに定義した画像を NSImageに読み込む
		// アニメーションの連結画像をリソースから読み込む
		// http://www.neko.ne.jp/~freewing/tmp/MacGoGoDance.png
		// 2500 * 228 px
		// ImageCatの名前でリソースに画像を定義しておく
		image = NSImage(named: "ImageCat")

		// 読み込んだ画像のサイズ(NSImageの sizeは dpに依存する)
 //		let imageSize = (image?.size)!

		// 読み込んだ画像サイズ NSBitmapImageRepの sizeは dpに依存しないので安全)
		let bitmapImageRef = NSBitmapImageRep(data:image!.TIFFRepresentation!)!
		let imageSize = (bitmapImageRef.size)
		Swift.print(String(format: "imageSize %4.0lf %4.0lf", imageSize.width, imageSize.height))

		// 1画像あたりのサイズを代入
		imageWidth = imageSize.width / CGFloat(numberOfImage)
		imageHeight = imageSize.height

		let scale: CGFloat = 3.2
		viewWidth = imageWidth * scale
		viewHeight = imageHeight * scale

		// NSImageViewを指定のサイズで生成
		imageView = NSImageView(frame: NSMakeRect(0.0, 0.0, viewWidth, viewHeight))

// ・画像をアスペクト比を保持して拡大縮小して表示する
		// アスペクト比を保持して拡大縮小
		imageView?.imageScaling = NSImageScaling.ScaleProportionallyUpOrDown

		// Windowsのサイズを画像と同じ大きさにする
		window.setContentSize(NSSize(width: displaySize!.width, height: viewHeight))

 //		// ウインドウをスクリーンの中心に配置
 //		window.center()

		// ウインドウをスクリーンの下端に配置
		window.setFrameOrigin(CGPoint(x: 0, y: 0))

		// NSImageViewを Windowに追加
		window.contentView!.addSubview(imageView!)

// ・Windowを最前面に表示
		// 前面に表示
		window.orderFront(self)
		// 表示
		window.makeKeyAndOrderFront(self)

		// 動かすドット数 X軸
		pitchX = CGFloat(floatLiteral: Double(displaySize!.width + imageWidth) / 256.0)
		if (pitchX < 1.0) {
			pitchX = 1.0
		}
	}


	// 画像更新メソッド
	func updateImageView()
	{
		// 表示画像を更新
		displayImage(imagePosition)

		// 次に表示する画像 index
		imagePosition += 1
		if (imagePosition >= numberOfImage) {
			imagePosition = 0
		}

		// 画像の表示位置を徐々に移動する
		var x = imageView!.frame.origin.x
		x -= CGFloat(pitchX)
		if (x >= displaySize!.width) {
			x = -viewWidth
		}
		else
		if (x < -viewWidth) {
			x = displaySize!.width - CGFloat(pitchX)
		}
		imageView!.frame.origin.x = x
	}


	func displayImage(position: Int)
	{
// ・画像の一部分を切り出して指定範囲に描画する
		// 切り出す画像の範囲を設定
		let rect: CGRect = CGRectMake(CGFloat(position) * imageWidth, 0, imageWidth, imageHeight)

// ・NSImageを CGImageに変換する
		// NSImageを CGImageに変換する
		let cgImage = image!.CGImageForProposedRect(nil, context: nil, hints: nil)!

		// CGImageの指定範囲を取り出す
		let imageRef: CGImageRef = CGImageCreateWithImageInRect(cgImage, rect)!

 // boundsは既に Viewの初期化の時に設定してあるので不要
 //		imageView!.bounds = rect

		// NSImageViewに画像をセットして表示
		imageView!.image = NSImage(CGImage: imageRef, size: CGSize(width: imageWidth, height: imageHeight))
	}

● Windowのタイトルバーを非表示にする

・Mac OSX Xcode Windowのタイトルバーを非表示にする(xibで設定する)
Mac OSX Xcode Windowのタイトルバーを非表示にする(xibで設定する)




●GoGo!って名前のぱつきんのおねえさんが踊るソフト

 以前 Androidで作成した「昔マックのデスクアクセサリにあった確かGoGo!って名前のぱつきんのおねえさんが踊るソフト」を現代の Macに甦らせてみます。

2011/11/23
Android 昔マックのデスクアクセサリにあった確かGoGo!って名前のぱつきんのおねえさんが踊るソフト
Android 昔マックのデスクアクセサリにあった確かGoGo!って名前のぱつきんのおねえさんが踊るソフト

  マックのOSがシステム6.0.Xの頃のデスクトップ アクセサリ「Go Go!」


Tags: [Apple], [MacBook]

●関連するコンテンツ(この記事を読んだ人は、次の記事も読んでいます)

Xcodeで Mac OSX用のクリップボード共有&履歴アプリを作る
Xcodeで Mac OSX用のクリップボード共有&履歴アプリを作る

  Mac OS X用アプリを Swift言語で作る方法、MacOSXでクリップボード監視で変化が有ったら取得

Xcode SWIFTで Mac OSX用のスクリーンキャプチャアプリ&画像保存を作る
Xcode SWIFTで Mac OSX用のスクリーンキャプチャアプリ&画像保存を作る

  Mac OS X用アプリを Swift言語で作る方法、デスクトップの画像をキャプチャする方法

Xcode SWIFTで Mac OSX用のスクリーン拡大鏡アプリを作る
Xcode SWIFTで Mac OSX用のスクリーン拡大鏡アプリを作る

  Mac OS X用アプリを Swift言語で作る方法、マウスカーソルの位置をリアルタイムで取得する方法

Xcode SWIFTで Mac OSX用の Finderからドラッグ&ドロップを受け付けるアプリを作る
Xcode SWIFTで Mac OSX用の Finderからドラッグ&ドロップを受け付けるアプリを作る

  Mac OS X用アプリを Swift言語で作る方法、ドラッグ&ドロップを受け付ける方法

Xcodeで Mac OSX用の使えそうな処理を Tipsとしてまとめ
Xcodeで Mac OSX用の使えそうな処理を Tipsとしてまとめ

  Mac OS X用アプリを Swift言語で作る方法

Apple MacBook Airを買ってみた。開発者必須アプリの紹介
Apple MacBook Airを買ってみた。開発者必須アプリの紹介

  Xcodeで iPhoneの開発の為に、Mac OS X用アプリを Swift言語で作る方法

Windowsパソコンで Macる。Skylake Platform in OSX86 Hackintoshの夢、BIOS設定内容
Windowsパソコンで Macる。Skylake Platform in OSX86 Hackintoshの夢、BIOS設定内容

  Windows PCで iPhone開発、Mac OS Xで Hackintoshの方法、DVMT Pre-Allocated 128MB

VirtualBoxに Mac OS X macOS Sierraをインストールの夢
VirtualBoxに Mac OS X macOS Sierraをインストールの夢

  Windowsの VirtualBoxに Mac環境を作り OS Xをインストールして動かす夢を見る

Raspberry Pi3で iPhoneの開発言語でお馴染みの Swiftを動かし、GPIOを操作して Lチカする方法
Raspberry Pi3で iPhoneの開発言語でお馴染みの Swiftを動かし、GPIOを操作して Lチカする方法

  Raspbian Jessieで Swift言語のセットアップ方法、GPIOの LEDを Lチカや I2Cを制御する方法




[HOME] | [BACK]
リンクフリー(連絡不要、ただしトップページ以外は Web構成の変更で移動する場合があります)
Copyright (c) 2016 FREE WING,Y.Sakamoto
Powered by 猫屋敷工房 & HTML Generator

http://www.neko.ne.jp/~freewing/xcode/xcode_swift_2_screen_mascot_2/